在我的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
或只是比较时间部分,计算以分钟为单位的时差并将其添加到时间戳记中。
答案 0 :(得分:3)
避免使用麻烦的旧式旧式日期时间类,例如java.util.Date
。仅使用 java.time 类。同样,Joda-Time项目现在也被 java.time 类所取代,这两个类都是由同一个人Stephen Colebourne创建的。
Instant
将您的Date
转换为Instant
。尽管使用了UTC方法,但这两个类都始终以UTC Date::toString
表示时刻。
使用添加到旧类中的新方法进行转换。
Instant instant = myJavaUtilDate.toInstant() ;
ZonedDateTime
为一对时间字符串指定的壁钟时间应用时区或UTC偏移量。您是说纽约的下午5点,突尼斯的下午5点,还是印度的下午5点?
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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 ) ;
通常最好使用“半开式”方法来定义时间跨度。这意味着开始是包含,而结束是包含。因此,如果要排除所有第十分钟,请测试“少于五点十一分”。
提示:说“等于或在……之后”的简短方式是“不在……之前”。
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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:0)
您有很多选择,其中一个比较简单:
1)-您可以将TimeStamp转换为LocalDateTime / Calendar对象,然后获取小时和分钟。
LocalDateTime localdt = sqlTimestamp.toLocalDateTime();
int hour = localdt.getHour();
int minute = localdt.getMinute();
2)-然后您可以解析字符串并比较结果。
- 您还可以将字符串转换为时间戳,因为这将需要一天的开始和结束并解析字符串。
- 但是,听起来您选择的数据类型将在以后带来麻烦。