Java - 将字符串中的给定日期时间转换为本地时区
Java - Convert a given DateTime in String to local timezone
我正在从数据库中读取时间戳作为字符串值,
说:
2020-04-30T09:59:00.272-05:00
。
现在我必须将它与本地时区(系统时区)中的当前时间戳进行比较
到目前为止我尝试了什么:
ZonedDateTime result = ZonedDateTime.parse("2020-04-30T09:59:00.272-05:00");
System.out.println("Given : "+result);
System.out.println("Given In Local: "+result.withZoneSameLocal(ZoneId.systemDefault()));
输出:
Given : 2020-04-30T09:59:00.272-05:00
Given In Local: 2020-04-30T09:59:00.272-05:00[America/Chicago]
我想要的输出是 "2020-04-30T14:59:00.272"
您可以将给定的日期字符串解析为 OffsetDateTime
,然后更改其偏移量并将其转换为 LocalDateTime
,如下所示
final String dateString = "2020-04-30T09:59:00.272-05:00";
final ZonedDateTime result = ZonedDateTime.parse(dateString);
System.out.println("Given : " + result);
final LocalDateTime localDateTime = OffsetDateTime.parse(dateString)
.atZoneSameInstant(ZoneId.of("Europe/Berlin"))
.toLocalDateTime();
System.out.println("Given In Local: " + localDateTime);```
打印
Given : 2020-04-30T09:59:00.272-05:00
Given In Local: 2020-04-30T16:59:00.272
此外,你也可以将其解析为ZonedDateTime
,然后更改时区,例如
final LocalDateTime result = ZonedDateTime.parse(dateString)
.withZoneSameInstant(ZoneId.of("Europe/Berlin"))
.toLocalDateTime();
我相信以下内容应该可以满足您的目的。
String dateTimeString = "2020-04-30T09:59:00.272-05:00";
OffsetDateTime databaseDateTime = OffsetDateTime.parse(dateTimeString );
OffsetDateTime currentDateTime = OffsetDateTime.now(ZoneId.systemDefault());
if (databaseDateTime.isAfter(currentDateTime)) {
System.out.println("" + databaseDateTime + " is after " + currentDateTime);
} else {
System.out.println("" + databaseDateTime + " is before or equal to " + currentDateTime);
}
当我运行刚才的代码在我的时区(Europe/Copenhagen)时输出:
2020-04-30T09:59:00.272-05:00 is after 2020-04-26T21:48:36.331752+02:00
由于数据库中的字符串包含 UTC 偏移量 (-05:00
) 并且没有时区(如 America/New_York),我发现解析为 OffsetDateTime
更合适。 ZonedDateTime
太过分了。对于当地时间,我将 ZoneId.systemDefault()
传递给 OffsetDateTime
的 now
方法。将两个 OffsetDateTime
对象与 isAfter()
进行比较效果很好,即使偏移量不同,也会考虑到这一点。还有方法isBefore
和isEqual
进行比较。
退一步说,在大多数设置中,您不应该从数据库中获取日期和时间作为字符串。您的 JDBC 4.2 驱动程序或现代 JPA 实现(例如 Hibernate 5)将很乐意为您从数据库中获取 OffsetDateTime
对象。例如参见 [=23=].
我正在从数据库中读取时间戳作为字符串值, 说:
2020-04-30T09:59:00.272-05:00
。 现在我必须将它与本地时区(系统时区)中的当前时间戳进行比较
到目前为止我尝试了什么:
ZonedDateTime result = ZonedDateTime.parse("2020-04-30T09:59:00.272-05:00");
System.out.println("Given : "+result);
System.out.println("Given In Local: "+result.withZoneSameLocal(ZoneId.systemDefault()));
输出:
Given : 2020-04-30T09:59:00.272-05:00
Given In Local: 2020-04-30T09:59:00.272-05:00[America/Chicago]
我想要的输出是 "2020-04-30T14:59:00.272"
您可以将给定的日期字符串解析为 OffsetDateTime
,然后更改其偏移量并将其转换为 LocalDateTime
,如下所示
final String dateString = "2020-04-30T09:59:00.272-05:00";
final ZonedDateTime result = ZonedDateTime.parse(dateString);
System.out.println("Given : " + result);
final LocalDateTime localDateTime = OffsetDateTime.parse(dateString)
.atZoneSameInstant(ZoneId.of("Europe/Berlin"))
.toLocalDateTime();
System.out.println("Given In Local: " + localDateTime);```
打印
Given : 2020-04-30T09:59:00.272-05:00
Given In Local: 2020-04-30T16:59:00.272
此外,你也可以将其解析为ZonedDateTime
,然后更改时区,例如
final LocalDateTime result = ZonedDateTime.parse(dateString)
.withZoneSameInstant(ZoneId.of("Europe/Berlin"))
.toLocalDateTime();
我相信以下内容应该可以满足您的目的。
String dateTimeString = "2020-04-30T09:59:00.272-05:00";
OffsetDateTime databaseDateTime = OffsetDateTime.parse(dateTimeString );
OffsetDateTime currentDateTime = OffsetDateTime.now(ZoneId.systemDefault());
if (databaseDateTime.isAfter(currentDateTime)) {
System.out.println("" + databaseDateTime + " is after " + currentDateTime);
} else {
System.out.println("" + databaseDateTime + " is before or equal to " + currentDateTime);
}
当我运行刚才的代码在我的时区(Europe/Copenhagen)时输出:
2020-04-30T09:59:00.272-05:00 is after 2020-04-26T21:48:36.331752+02:00
由于数据库中的字符串包含 UTC 偏移量 (-05:00
) 并且没有时区(如 America/New_York),我发现解析为 OffsetDateTime
更合适。 ZonedDateTime
太过分了。对于当地时间,我将 ZoneId.systemDefault()
传递给 OffsetDateTime
的 now
方法。将两个 OffsetDateTime
对象与 isAfter()
进行比较效果很好,即使偏移量不同,也会考虑到这一点。还有方法isBefore
和isEqual
进行比较。
退一步说,在大多数设置中,您不应该从数据库中获取日期和时间作为字符串。您的 JDBC 4.2 驱动程序或现代 JPA 实现(例如 Hibernate 5)将很乐意为您从数据库中获取 OffsetDateTime
对象。例如参见 [=23=].