java - 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
解决方案
除了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
设置一次并重复使用,使用它的代码更简单,但总体而言代码并不简单。
推荐阅读
- r - Plot() 脉冲响应函数 - 在一个窗口中显示多个?
- javascript - 使用 Google App Script 从 API 中提取数据
- javascript - 在 Node.js 中 writeFileSync 返回无效的参数类型错误
- matlab - 如何使用 matlab 的解压缩功能提取 .sp3.zip 文件?
- c++ - 在字符上拆分/修剪字符串
- django - 获取 ValuError:字段 'id' 需要一个数字,但得到一个 html
- php - php 如何复制调色板?
- android - Html 格式化字符串到 Textview
- python - 如何在带有条件的 Pandas 中添加列
- python - 是否可以在此标题和情节之间添加更多空白?