给定任何日期/时间格式(由用户传递),我需要用它解析日期并返回自java epoch以来的毫秒数,这可以通过使用旧日期api的以下代码来完成:
//dateFormatter is SimpleDateFormat
Date d = dateFormatter.parse(value);
return d.getTime();
格式的唯一要求是包含日期部分,例如,以下所有格式都是可能的:
"dd/MM/yyyy"
"dd/MM/yyyy HH:mm X" //with timezone
缺失部分以当天开始/当地时区完成。因此,我提出了以下建议,似乎更加冗长,不确定是否有更有效的方法:
//dateFormatter is DateTimeFormatter
TemporalAccessor ta = dateFormatter.parse(value);
LocalDate ld = LocalDate.from(ta); //assume must have date part
LocalTime lt = ta.query(TemporalQueries.localTime());
if (lt == null) {
lt = LocalTime.MIN;
}
ZoneId zoneId = ta.query(TemporalQueries.zone());
if (zoneId == null) {
zoneId = ZoneId.systemDefault();
}
Instant d = LocalDateTime.of(ld, lt).atZone(zoneId).toInstant();
return d.toEpochMilli();
2条答案
按热度按时间ruyhziif1#
使用
DateTimeFormatterBuilder.parseDefaulting
要在格式字符串中找不到该字段时设置默认值,请执行以下操作:fd3cxomn2#
如sweeper在answer by sweeper中所示,您可以在格式化程序中指定默认值。
区域id的处理方式不同,它不仅是一个默认值,也是一种覆盖,必须使用
withZone(ZoneId zone)
在构建格式化程序之后。如果格式和值指定了一个区域id,那么就使用它,一切正常。如果未指定区域id或区域偏移量,则使用给定的“default”。但是,如果只指定了区域偏移量,则它将用于解析,但“默认”区域id将覆盖结果,并相应地调整时间和区域偏移量。
因为您需要epoch毫秒,所以这实际上并不影响这段代码,我只想为可能不会最终转换为utc的其他用户提一下。
代码应为:
测试
输出