2

我有两个字符串格式的日期:sayString date1 = 2018-08-29ISO-OFFSET_DATE_TIME格式为String date2 = 2018-08-30T00:00:00+10:00. 比较 date1 和 date2 是否相等的最佳方法是什么?我不关心时间,只关心日、年和月。我应该将它们转换为即时并进行比较吗?

4

3 回答 3

3

最快的方法是;

String date1 = "2018-08-29";
String date2 = "2018-08-30T00:00:00+10:00";
boolean isEqual = date2.startsWith(date1);
于 2018-08-30T00:36:53.657 回答
3

tl;博士

LocalDate
.parse( "2018-08-29" ) 
.isEqual(
    OffsetDateTime
    .parse( "2018-08-30T00:00:00+10:00" )
    .toLocalDate()
)

错误的

java.time

在java.time中的适当类型期间解析每个输入。

LocalDate ld = LocalDate.parse( "2018-08-29" ) ;
OffsetDateTime odt = OffsetDateTime.parse( "2018-08-30T00:00:00+10:00" ) ;

LocalDate通过从 中提取 a 进行比较OffsetDateTime

Boolean sameDate = ld.isEqual( odt.toLocalDate() ) ;

错误的

或者,也许您想将其OffsetDateTime从 UTC 前十小时的偏移量调整为另一个偏移量或时区。例如,让我们在提取要比较的日期之前调整回 UTC。

LocalDate
.parse( "2018-08-29" ) 
.isEqual(
    OffsetDateTime
    .parse( "2018-08-30T00:00:00+10:00" )
    .withOffsetSameInstant( ZoneOffset.UTC )
    .toLocalDate()
)

这将我们的结果从false上面代码中看到的 更改为true

真的

于 2018-08-30T05:13:52.163 回答
0

如果这是您唯一想知道的关于这两个字符串的事情:

    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");
    }

使用您的字符串示例输出问题:

它们是不同的日期

当他的回答到来时,我正在编写类似于Basil Bourque的代码。我更喜欢通过正确的日期时间对象来处理日期和时间,这正是他正在做的事情。通过解析date2OffsetDateTime您保留了所有信息,并且转换为LocalDate用于比较很容易。对于大多数目的,我推荐这种方式。

只有当你确定你永远不需要一天中的时间时,你才能走捷径。你当然可以使用王俊杰的快捷方式。不过,我更喜欢上面自己的代码,原因有两个:我清楚地告诉读者字符串是日期和时间,并正确处理它们。因此,它还提供了对字符串格式的验证。如果有一天你偶然得到一个完全不同的字符串,你会通过一个DateTimeParseException.

于 2018-08-30T05:28:20.780 回答