给出区域名称和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
答案 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-18
是LocalDate
的默认格式(AKA ISO 8601):
ZonedDateTime zdt = LocalDate.parse(date).atStartOfDay().atZone(zone);