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

在Java中,如何比较时间戳是否落在给定时间段的范围内,java,calendar,jodatime,Java,Calendar,Jodatime,在我的javaspringmvcweb应用程序中,我试图编写一个程序来保存一些带有时间戳的数据。但我有一个特定的时间段,我必须排除 例如,我有以下时间戳:satjul2817:03:00ist2018,这是一个Java日期对象。在保存到数据库之前,我必须检查这个时间是否在指定的范围内,如果我必须在时间范围结束后的下一分钟内 但时间范围是以下格式的字符串: String startTime = "5:03 PM"; String endTime = "5:10 PM"; 因此,如果我的时间戳在

在我的
javaspringmvcweb应用程序
中,我试图编写一个程序来保存一些带有时间戳的数据。但我有一个特定的时间段,我必须排除

例如,我有以下时间戳:
satjul2817:03:00ist2018
,这是一个Java日期对象。在保存到数据库之前,我必须检查这个时间是否在指定的范围内,如果我必须在时间范围结束后的下一分钟内

但时间范围是以下格式的字符串:

String startTime =  "5:03 PM";
String endTime = "5:10 PM";
因此,如果我的时间戳在这两个时间之间,我的时间戳应该更新为2018年7月28日星期六17:11:00

我现在正在寻找比较两个时间值的方法,因为一个是字符串,另一个是时间戳


有没有办法转换
字符串endTime=“5:10 PM”
;到2018年7月28日星期六17:11:00
或比较时间部分,计算以分钟为单位的差异,并将其添加到时间戳中。

您有很多选择,其中一个简单的选择是:

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

LocalDateTime localdt = sqlTimestamp.toLocalDateTime();
int hour = localdt.getHour();
int minute = localdt.getMinute();
2) -然后您可以解析字符串并比较结果

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

-
尽管如此,听起来您选择的数据类型以后会带来麻烦。

您有很多选择,其中一个简单的选择是:

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

LocalDateTime localdt = sqlTimestamp.toLocalDateTime();
int hour = localdt.getHour();
int minute = localdt.getMinute();
2) -然后您可以解析字符串并比较结果

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

- 尽管如此,听起来您选择的数据类型以后会带来麻烦。

避免遗留日期时间类 避免麻烦的旧遗留日期时间类,例如
java.util.date
。仅使用java.time类。同样,项目现在也被java.time类取代,这两个类都是由同一个人创建的

Instant
将您的
日期
转换为。这两个类都代表了一个时刻,始终以UTC为单位,不管方法如何

使用添加到旧类的新方法进行转换

Instant instant = myJavaUtilDate.toInstant() ;
ZoneDateTime
将时区或UTC偏移量应用于一对时间字符串指定的挂钟时间。你是说纽约下午5点,突尼斯下午5点,还是印度下午5点

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

提取一天中没有日期和区域的时间

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. 
}
如果该区域中该日期的时间无效,则该类会根据需要进行调整

数据库 为了在带有时区的
TIMESTAMP类型的列中保存到数据库中,让我们通过提取
瞬时值来将时刻调整为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 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期Android(避免遗留日期时间类 避免麻烦的旧遗留日期时间类,例如
      java.util.date
      。只使用java.time类。同样,项目现在也被java.time类取代,这两个类都是由同一个人创建的

      Instant
      将您的
      日期
      转换为。这两个类都代表一个时刻,始终以UTC为单位,尽管方法对您不利

      使用添加到旧类的新方法进行转换

      Instant instant = myJavaUtilDate.toInstant() ;
      
      ZoneDateTime
      将时区或UTC偏移量应用于一对时间字符串指定的挂钟时间。您指的是纽约的下午5点,突尼斯的下午5点,还是印度的下午5点

      请以
      大陆/地区
      的格式指定一个,例如,或
      太平洋/奥克兰
      。切勿使用3-4个字母的缩写,例如
      EST
      IST
      ,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)

      提取一天中没有日期和区域的时间

      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 ) ;
      
      半开 一般来说,最好使用半开放的方法来定义时间跨度。这意味着开始是包含的,而结束是独占的。所以测试“更少的时间”