【问题标题】:Android compare dateAndroid 比较日期
【发布时间】:2016-07-13 15:41:26
【问题描述】:

我正在尝试以这种格式比较两个日期。

date1 = Wed Jul 13 17:23:33 GMT+02:00 2016
date2 = Wed Jul 13 17:23:31 CEST 2016

if(date1.after(date2){
//my logic
}else if(date1.before(date2){
//my logic
}

比较好像只发生了几次,哪里认为是错误的?

【问题讨论】:

    标签: android date compare


    【解决方案1】:

    使用compareTo 方法。

    int compare = date1.compareTo(date2);
    

    比较 > 0,如果 date1 大于 date2

    比较 = 0,如果 date1 等于 date2

    比较

    【讨论】:

    • 我已经试过了。我认为问题出在GMTCEST
    【解决方案2】:

    tl;博士

    ZonedDateTime.parse( 
        "Wed Jul 13 17:23:33 GMT+02:00 2016" , 
        DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss z uuuu" )
            .withLocale( Locale.ENGLISH ) 
    )
    .isAfter(
        ZonedDateTime.parse( 
            "Wed Jul 13 17:23:31 CEST 2016" , 
            DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss z uuuu" )
                .withLocale( Locale.ENGLISH ) 
        )
    )
    

    java.time

    现代方法使用 java.time 类。

    String inputX = "Wed Jul 13 17:23:33 GMT+02:00 2016";
    String inputY = "Wed Jul 13 17:23:31 CEST 2016";
    

    定义格式模式以匹配您的输入字符串。

    DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss z uuuu" ).withLocale( Locale.ENGLISH );
    

    ZonedDateTime 类代表一个时刻,时间线上的一个点,具有特定地区(时区)的人们使用的挂钟时间。指定 Locale 以确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范。

    ZonedDateTime x = ZonedDateTime.parse( inputX , f );
    ZonedDateTime y = ZonedDateTime.parse( inputY , f );
    

    x.toString(): 2016-07-13T17:23:33+02:00[GMT+02:00]

    y.toString(): 2016-07-13T17:23:31+02:00[欧洲/巴黎]

    在实际工作中,捕获输入错误时抛出的异常。

    比较

    使用isBeforeisAfterisEqual 或方法进行比较。请注意,Comparable::equals 方法的实现在行为上有所不同 (read the doc)。

    if( x.isBefore( y ) ) {           // BEFORE
        …
    } else if( x.isAfter( y ) ) {     // AFTER
        …
    } else if( x.isEqual( y ) ) {     // EQUAL
        …  
    } else {                          // UNREACHABLE
        … // Handle error condition. Should be unreachable.
    }
    

    区域

    顺便说一句,您的两个输入使用的格式选择很差。第一个只有一个与 UTC 的偏移量,而不是一个实际的时区。第二个带有“CEST”的伪区域。这种 3-4 个字母的标签在主流媒体中很常见,但不是真正的时区,没有标准化,甚至不是唯一的(!)。

    continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

    ZoneId z = ZoneId.of( "America/Montreal" ) ;  
    

    在将日期时间值交换为文本时,请尽可能使用标准 ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用标准格式。 ZonedDateTime 类明智地扩展了标准格式,将时区名称附加在方括号中,如上例所示。


    关于java.time

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

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

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

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

    从哪里获得 java.time 类?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2011-01-21
      • 1970-01-01
      • 2011-12-31
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多