[英]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/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用EST
或IST
等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 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的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中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
您有很多選擇,更簡單的選擇之一是:
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.