如何在Java中比较时间戳是否落在给定时间段的范围内

时间:2018-07-27 10:55:28

标签: java calendar jodatime

在我的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或只是比较时间部分,计算以分钟为单位的时差并将其添加到时间戳记中。

2 个答案:

答案 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/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

您有很多选择,其中一个比较简单:

1)-您可以将TimeStamp转换为LocalDateTime / Calendar对象,然后获取小时和分钟。

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

2)-然后您可以解析字符串并比较结果。

- 您还可以将字符串转换为时间戳,因为这将需要一天的开始和结束并解析字符串。

- 但是,听起来您选择的数据类型将在以后带来麻烦。