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