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

我正在比较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.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 ) ;