【发布时间】: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
}
比较好像只发生了几次,哪里认为是错误的?
【问题讨论】:
我正在尝试以这种格式比较两个日期。
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
}
比较好像只发生了几次,哪里认为是错误的?
【问题讨论】:
使用compareTo 方法。
int compare = date1.compareTo(date2);
比较 > 0,如果 date1 大于 date2
比较 = 0,如果 date1 等于 date2
比较
【讨论】:
GMT 和CEST
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 类。
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[欧洲/巴黎]
在实际工作中,捕获输入错误时抛出的异常。
使用isBefore、isAfter、isEqual 或方法进行比较。请注意,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/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
在将日期时间值交换为文本时,请尽可能使用标准 ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用标准格式。 ZonedDateTime 类明智地扩展了标准格式,将时区名称附加在方括号中,如上例所示。
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
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 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。
【讨论】: