java日历比较不正确
我正在比较java中的两个日历对象。这就是我设置它们的方式java日历比较不正确,java,calendar,comparison,Java,Calendar,Comparison,我正在比较java中的两个日历对象。这就是我设置它们的方式 Calendar calendar1 = Calendar.getInstance(); calendar1.set(2012, 6, 17, 13, 0); 我从表列“2012-07-17 13:00:00”中获取以下值,并将其设置为Date Java对象,然后使用这个Date对象设置第二个Calander对象 Calendar calendar2 = Calendar.getInstance(); calendar2.setTim
Calendar calendar1 = Calendar.getInstance();
calendar1.set(2012, 6, 17, 13, 0);
我从表列“2012-07-17 13:00:00”中获取以下值,并将其设置为Date Java对象,然后使用这个Date对象设置第二个Calander对象
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(/*Above date object who value is '2012-07-17 13:00:00'*/);
现在当我比较时,我希望这是真的,因为两个日历对象是相同的
calendar2.compareTo(calendar1) >= 0
但相反,我看到这正在成为现实
calendar2.compareTo(calendar1) < 0
calendar2.与(calendar1)比较<0
有人能帮忙吗?以下内容将告诉您发生了什么(假设您正在解析字符串以生成
calendar1
的日期对象):
测试运行结果:
Tue Jul 17 13:00:47 CDT 2012
Tue Jul 17 13:00:00 CDT 2012
-1
0
2012年7月17日星期二13:00:47 CDT
2012年7月17日星期二13:00:00 CDT
-1
0
根据@Bhesh Gurung的建议,我使用了以下内容 calendar1.set(Calendar.毫秒,0); calendar1.set(Calendar.SECOND,0) calendar2.set(Calendar.毫秒,0); calendar2.set(Calendar.SECOND,0) 它成功了。tl;博士 时区 你没有提供足够的信息来给出一个明确的答案,但正如其他人所说的那样,你可能看到了时区的问题。您的代码没有明确地解决这个关键问题。但是,您创建的
日历
项隐含地分配了一个时区
java.time
更重要的是,您使用的是麻烦的旧日期时间类,现在已被java.time类取代
将您使用的日历
替换为即时
和分区日期
对于ZonedDateTime
,显式指定所需/预期时区,而不是隐式应用JVM的当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
通过提取一个瞬间
,调整为UTC。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
数据库
从数据库中交换对象,而不仅仅是字符串。从JDBC4.2及更高版本开始,您可以交换java.time对象
大多数数据库将一个时刻(如SQL标准类型带有时区的时间戳)存储为UTC值。因此,使用即时对象通常是最好的
存储您的即时对象的值
myPreparedStatement.setObject( … , instant ) ;
检索
Instant instantDb = myResultSet.getObject( … , Instant.class ) ;
使用Instant
方法equals
、isBefore
和isAfter
进行比较
boolean sameMoment = instant.equals( instantDb ) ;
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
类
从哪里获得java.time类
- 然后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期Android(返回的日历基于默认时区中的当前时间和默认语言环境。
calendar1.set(2012,6,17,13,0)
只上至分钟字段,而秒和毫秒没有设置为0。那么如何设置秒和毫秒呢?查看文档,您可以找到获取字段和值的set
方法。仅供参考,麻烦的旧日期时间类,如,java.text.SimpleDateFormat
现在是,支持Java 8及更高版本中内置的类使其无法运行。请参阅。
Instant instant = zdt.toInstant() ;
myPreparedStatement.setObject( … , instant ) ;
Instant instantDb = myResultSet.getObject( … , Instant.class ) ;
boolean sameMoment = instant.equals( instantDb ) ;