【问题标题】:Java Date/Calendar object strings, compareJava 日期/日历对象字符串,比较
【发布时间】:2011-09-14 03:13:06
【问题描述】:

我的日期对象格式类似于

2011/06/13 17:52:20

并以字符串形式返回。我如何将其与以相同方式格式化的另一个日期进行比较。对于我正在形成的条件语句,我想确定哪个大于、小于或等于。

当可能已经有这样做的框架时,无需重新发明轮子(或制作几个案例)

谢谢!

【问题讨论】:

    标签: java string date calendar conditional


    【解决方案1】:
    • 使用SimpleDateFormat解析
    • 使用获得的Date对象中的compareTo(..)

    例如:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Date date1 = sdf.parse(string1);
    Date date2 = sdf.parse(string2);
    
    int result = date1.compareTo(date2);
    

    结果是(来自java.util.Date 文档):

    如果参数 Date 等于此 Date,则值为 0;如果此 Date 在 Date 参数之前,则值小于 0;如果此 Date 在 Date 参数之后,则值大于 0。

    【讨论】:

    • 好的,我需要比较的日期之一是从服务器以相同格式返回的,但这是作为字符串返回的,所以我需要将该字符串日期转换为日期对象。我还没有研究过,洞察力赞赏。编辑:看到你的编辑,我可以处理!
    【解决方案2】:

    在我看来,您的日期格式是 yyyy/mm/dd hh:mm:ss。如果是这种情况,您可以进行字符串比较,它将为您提供准确的更大/更少/等于。该字符串被编码为最重要到最不重要。

    【讨论】:

      【解决方案3】:

      我的同事上周向我指出,yyyy-MM-dd HH:mm:ss 字符串与基础日期的顺序完全兼容(只要字段都是零填充的)。因此,如果 String 值更容易获得,您可以只对它们进行 compareTo。

      【讨论】:

        【解决方案4】:

        虽然 SimpleDateFormat 允许将文本解析为日期对象,但最好将日期存储为 Date 对象并在显示时对其进行解析。

        创建/存储 Date 对象并使用它们内置的 compareTo() 方法。

        【讨论】:

          【解决方案5】:

          tl;博士

          LocalDateTime.parse( "2011/06/13 17:52:20".replace( " " , "T" ) )
                       .isBefore( LocalDateTime.now() )
          

          是的

          详情

          其他答案是正确的,因为您可以 (a) 按字母顺序比较这些特定字符串,或 (b) 在解析为日期时间对象后按时间顺序比较。

          请注意,日期时间格式没有“格式”。它们包含日期时间信息。他们可以生成一个特定格式的字符串,但是日期时间对象和字符串是分开和不同的。

          其他答案使用麻烦的旧日期时间类,它们现在是遗留的,被 java.time 类取代。

          您的输入缺少有关与 UTC 的偏移量和时区的信息。所以我们必须将它们解析为LocalDateTime 对象。要进行解析,请将中间的 SPACE 替换为 T,以符合 ISO 8601 标准,用于格式化表示日期时间值的字符串。

          String input = "2011/06/13 17:52:20".replace( " " , "T" );
          LocalDateTime ldtThen = LocalDateTime.parse( input ) ;
          LocalDateTime ldtNow = LocalDateTime.now( ZoneId.of( "America/Montreal" ) ) ;
          

          比较。

          boolean ldtThenIsBefore = ldtThen.isBefore( ldtNow );
          boolean ldtThenIsAfter = ldtThen.isAfter( ldtNow );
          boolean ldtThenIsEqual = ldtThen.isEqual( ldtNow );
          

          关于java.time

          java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

          Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

          要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

          从哪里获得 java.time 类?

          ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-19
            • 1970-01-01
            • 2023-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多