簡體   English   中英

如何在Java中比較時間戳是否落在給定時間段的范圍內

[英]How to compare if a timestamp falls in range of a given time period in Java

Java Spring MVC Web Application ,我試圖編寫一個程序來保存帶有時間戳的一些數據。 但是我有一個必須排除的特定時間段。

例如,我具有以下時間戳: Sat Jul 28 17:03:00 IST 2018 ,它是一個Java Date對象。 保存到數據庫之前,我必須檢查該時間是否在指定的范圍內,否則我必須在時間范圍結束后的第二分鍾獲取時間。

但是時間范圍是以下格式的字符串:

String startTime =  "5:03 PM";
String endTime = "5:10 PM";

因此,如果我的時間戳記在此時間之間,我的時間戳記應更新為Sat Jul 28 17:11:00 IST 2018

我現在正在尋找比較兩個時間值的方法,因為一個是字符串,另一個是時間戳。

有什么方法可以轉換String endTime = "5:10 PM" ; Sat Jul 28 17:11:00 IST 2018的時間,或者只是比較時間部分,計算以分鍾為單位的差異並將其添加到時間戳中。

避免使用舊的日期時間類

避免麻煩的舊的舊式日期時間類,例如java.util.Date 僅使用java.time類。 同樣, Joda-Time項目現在也被java.time類取代,這兩個類都是由同一個人Stephen Colebourne創建的。

Instant

將您的Date轉換為Instant 盡管Date::toString方法對您Date::toString ,但這兩個類均以UTC表示時刻,始終以UTC表示時刻。

使用添加到舊類中的新方法進行轉換。

Instant instant = myJavaUtilDate.toInstant() ;

ZonedDateTime

為一對時間字符串指定的壁鍾時間應用時區或UTC偏移量。 您是說紐約的下午5點,突尼斯的下午5點,還是印度的下午5點?

continent/region的格式指定正確的時區名稱 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;  // Or "Pacific/Auckland" etc. 
ZonedDateTime zdt = instant.atZone( z ) ;

提取沒有日期和區域的一天中的時間。

LocalTime lt = zdt.toLocalTime() ;

LocalTime

將您的限制解析為LocalTime對象。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "h:mm a" , Locale.US ) ;

LocalTime start = LocalTime.parse( "5:03 PM" , f ) ;
LocalTime stop = LocalTime.parse( "5:11 PM" , f ) ;

半開

通常最好使用Half-Open方法來定義時間跨度。 這意味着,一開始是包容性的 ,而結局是排他的 因此,如果要排除所有第十分鍾,請測試“少於五點十一分”。

提示:“等於或等於”的簡短說法是“不等於”。

if ( ( ! lt.isBefore( start ) ) && lt.isBefore( stop ) ) {
    zdt = zdt.with( stop ) ;  // Change to a different time-of-day. 
}

如果該日期在那個區域中的那一天中的一天無效,則ZonedDateTime類將根據需要進行調整。

數據庫

為了保存到TIMESTAMP WITH TIME ZONE類型的列中的數據庫,讓我們通過提取Instant時刻調整為UTC。

Instant instantForDatabase = zdt.toInstant() ;
…
myPreparedStatement.setObject( … , instantForDatabase ) ;

從數據庫中檢索。

Instant instantFromDatabase = myResultSet.getObject( … , Instant.class ) ;
ZoneId zMontreal = ZoneId.of( "America/Montreal" ) ;  // Or "Asia/Kolkata" etc.
ZondDateTime zdtMontreal = instantFromDatabase.atZone( zMontreal ) ;  

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

您有很多選擇,更簡單的選擇之一是:

1)-您可以將TimeStamp轉換為LocalDateTime / Calendar對象,然后獲取小時和分鍾。

LocalDateTime localdt = sqlTimestamp.toLocalDateTime();
int hour = localdt.getHour();
int minute = localdt.getMinute();

2)-然后,您可以解析字符串並比較結果。

-您還可以將字符串轉換為時間戳,因為這將需要一天的開始和結束並解析字符串。

-盡管如此,聽起來您選擇的數據類型以后會帶來麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM