Java 8 LocalDateTime和ZonedDateTime转换

时间:2018-08-14 14:51:32

标签: java datetime-format localdate zoneddatetime

给出区域名称和outputDtf,这是使用Java 8 LocalDateTime和ZonedDateTime的最佳方法吗?我想尽可能简化。

String zoneName = "America/Los_Angeles";
DateTimeFormatter outputDtf = DateTimeFormatter
        .ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")
        .withZone(ZoneId.of(zoneName));

// timestamp in UTC. convert to zone America/Los_Angeles
DateTimeFormatter timestampDtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String timestamp = "20180722060602";
LocalDateTime ldt = LocalDateTime.parse(timestamp, timestampDtf);
Instant tsInstant = ldt.atZone(ZoneId.of("UTC")).toInstant();
System.out.println(outputDtf.format(tsInstant));
// 2018-07-21T23:06:02-0700

// date in zone America/Los_Angeles. add start of day and zone
DateTimeFormatter dateDtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String date = "2018-07-18";
ZonedDateTime zdt = LocalDate.parse(date, dateDtf).atStartOfDay().atZone(ZoneId.of(zoneName));
System.out.println(outputDtf.format(zdt));
// 2018-07-18T00:00:00-0700

2 个答案:

答案 0 :(得分:0)

除了在第一个示例中删除toInstant()之外,没有其他要简化的内容。

您必须解析输入字符串,必须指定时区,并且对于仅日期,您必须说它是在午夜。

这些是您正在执行的步骤,尽管可以使DateTimeFormatter起作用,但无法简化。

String zoneName = "America/Los_Angeles";
DateTimeFormatter outputDtf = DateTimeFormatter
        .ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")
        .withZone(ZoneId.of(zoneName));

// timestamp in UTC. convert to zone America/Los_Angeles
DateTimeFormatter timestampDtf = DateTimeFormatter
        .ofPattern("yyyyMMddHHmmss")
        .withZone(ZoneOffset.UTC);
String timestamp = "20180722060602";
ZonedDateTime zdt1 = ZonedDateTime.parse(timestamp, timestampDtf);
System.out.println(outputDtf.format(zdt1)); // 2018-07-21T23:06:02-0700

// date in zone America/Los_Angeles. add start of day and zone
DateTimeFormatter dateDtf = new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd")
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .toFormatter()
        .withZone(ZoneId.of(zoneName));
String date = "2018-07-18";
ZonedDateTime zdt2 = ZonedDateTime.parse(date, dateDtf);
System.out.println(outputDtf.format(zdt2)); // 2018-07-18T00:00:00-0700

如您所见,如果将DateTimeFormatter设置一次并重新使用,则使用 的代码会更简单,但是总的来说,代码并不简单。

答案 1 :(得分:0)

您的代码通常没问题,您可以做得更好。

在第一个代码段中,我将使用OffsetDateTime而不是Instant

    OffsetDateTime tsOffsetDateTime = ldt.atOffset(ZoneOffset.UTC);
    System.out.println(outputDtf.format(tsOffsetDateTime));

第二个代码段中不需要格式化程序,因为字符串2018-07-18LocalDate的默认格式(AKA ISO 8601):

    ZonedDateTime zdt = LocalDate.parse(date).atStartOfDay().atZone(zone);

链接: Wikipedia article: ISO 8601