Java 日期比较:不同格式的日期
Java Date comparison: Dates in different formats
我有两个字符串格式的日期:比如 String date1 = 2018-08-29
和 ISO-OFFSET_DATE_TIME
格式的 String date2 = 2018-08-30T00:00:00+10:00
。比较 date1 和 date2 是否相等的最佳方法是什么?我不关心时间,只关心日、年和月。我应该将它们转换为即时并进行比较吗?
最快的方法是;
String date1 = "2018-08-29";
String date2 = "2018-08-30T00:00:00+10:00";
boolean isEqual = date2.startsWith(date1);
tl;博士
LocalDate
.parse( "2018-08-29" )
.isEqual(
OffsetDateTime
.parse( "2018-08-30T00:00:00+10:00" )
.toLocalDate()
)
false
java.time
在 java.time 中的适当类型期间解析每个输入。
LocalDate ld = LocalDate.parse( "2018-08-29" ) ;
OffsetDateTime odt = OffsetDateTime.parse( "2018-08-30T00:00:00+10:00" ) ;
通过从 OffsetDateTime
中提取一个 LocalDate
进行比较。
Boolean sameDate = ld.isEqual( odt.toLocalDate() ) ;
false
或者您可能想要将 OffsetDateTime
从其比 UTC 提前 10 小时的偏移量调整为另一个偏移量或时区。例如,让我们在提取日期进行比较之前调整回 UTC。
LocalDate
.parse( "2018-08-29" )
.isEqual(
OffsetDateTime
.parse( "2018-08-30T00:00:00+10:00" )
.withOffsetSameInstant( ZoneOffset.UTC )
.toLocalDate()
)
这将我们的结果从上面代码中的 false
更改为 true
。
true
如果这是您唯一想知道的关于这两个字符串的事情:
LocalDate ld1 = LocalDate.parse(date1);
LocalDate ld2 = LocalDate.parse(date2, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
if (ld1.isEqual(ld2)) {
System.out.println("They are the same date");
} else {
System.out.println("They are different dates");
}
使用您的字符串示例输出问题:
They are different dates
他的回答来的时候我正在写类似于的代码。我更喜欢通过正确的日期时间对象来处理日期和时间,这正是他正在做的。通过将 date2
解析为 OffsetDateTime
,您可以保留所有信息,并且很容易转换为 LocalDate
进行比较。对于大多数用途,我推荐这种方式。
只有当您确定自己永远不需要时间时,您才可以走捷径。您当然可以使用 。不过,出于两个原因,我更喜欢上面我自己的代码:我清楚地告诉 reader 字符串是日期和时间,并正确地处理它们。因此,它还提供了字符串格式的验证。如果有一天你不小心得到了一个完全不同的字符串,你将通过 DateTimeParseException
.
得到通知
我有两个字符串格式的日期:比如 String date1 = 2018-08-29
和 ISO-OFFSET_DATE_TIME
格式的 String date2 = 2018-08-30T00:00:00+10:00
。比较 date1 和 date2 是否相等的最佳方法是什么?我不关心时间,只关心日、年和月。我应该将它们转换为即时并进行比较吗?
最快的方法是;
String date1 = "2018-08-29";
String date2 = "2018-08-30T00:00:00+10:00";
boolean isEqual = date2.startsWith(date1);
tl;博士
LocalDate
.parse( "2018-08-29" )
.isEqual(
OffsetDateTime
.parse( "2018-08-30T00:00:00+10:00" )
.toLocalDate()
)
false
java.time
在 java.time 中的适当类型期间解析每个输入。
LocalDate ld = LocalDate.parse( "2018-08-29" ) ;
OffsetDateTime odt = OffsetDateTime.parse( "2018-08-30T00:00:00+10:00" ) ;
通过从 OffsetDateTime
中提取一个 LocalDate
进行比较。
Boolean sameDate = ld.isEqual( odt.toLocalDate() ) ;
false
或者您可能想要将 OffsetDateTime
从其比 UTC 提前 10 小时的偏移量调整为另一个偏移量或时区。例如,让我们在提取日期进行比较之前调整回 UTC。
LocalDate
.parse( "2018-08-29" )
.isEqual(
OffsetDateTime
.parse( "2018-08-30T00:00:00+10:00" )
.withOffsetSameInstant( ZoneOffset.UTC )
.toLocalDate()
)
这将我们的结果从上面代码中的 false
更改为 true
。
true
如果这是您唯一想知道的关于这两个字符串的事情:
LocalDate ld1 = LocalDate.parse(date1);
LocalDate ld2 = LocalDate.parse(date2, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
if (ld1.isEqual(ld2)) {
System.out.println("They are the same date");
} else {
System.out.println("They are different dates");
}
使用您的字符串示例输出问题:
They are different dates
他的回答来的时候我正在写类似于date2
解析为 OffsetDateTime
,您可以保留所有信息,并且很容易转换为 LocalDate
进行比较。对于大多数用途,我推荐这种方式。
只有当您确定自己永远不需要时间时,您才可以走捷径。您当然可以使用 DateTimeParseException
.