首页 > 解决方案 > Java 8 LocalDateTime 和 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

标签: javadatetime-formatlocaldatezoneddatetime

解决方案


除了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设置一次并重复使用,使用它的代码更简单,但总体而言代码并不简单。


推荐阅读