将字符串时间戳解析为即时抛出不受支持的字段:InstantSeconds
Posted
技术标签:
【中文标题】将字符串时间戳解析为即时抛出不受支持的字段:InstantSeconds【英文标题】:Parse String timestamp to Instant throws Unsupported field: InstantSeconds 【发布时间】:2016-06-07 05:47:33 【问题描述】:我正在尝试将字符串转换为 Instant。你能帮帮我吗?
我得到以下异常:
原因:java.time.temporal.UnsupportedTemporalTypeException:不支持的字段:InstantSeconds 在 java.time.format.Parsed.getLong(Parsed.java:203) 在 java.time.Instant.from(Instant.java:373)
我的代码基本上是这样的
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String timestamp = "2016-02-16 11:00:02";
TemporalAccessor temporalAccessor = formatter.parse(timestamp);
Instant result = Instant.from(temporalAccessor);
我正在使用 Java 8 更新 72。
【问题讨论】:
您的第一个输入不是瞬间的。时区丢失。 我在尝试使用 DateTimeFormatter.ofLocalizedDateTime 2-arg 构造函数时遇到此错误,我可以在 Internet 上找到 0 个示例。它不喜欢将 FormatStyle.SHORT 作为 timeFormat 的第二个参数传递给方法。 【参考方案1】:更简单的方法是在声明时将默认时区添加到格式化程序对象
final DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault());
Instant result = Instant.from(formatter.parse(timestamp));
【讨论】:
我喜欢这个解决方案的紧凑性。 我仍然收到此错误,直到我注意到我偶然使用了hh
而不是HH
。【参考方案2】:
以下是如何获取具有默认时区的 Instant。您的字符串无法直接解析为 Instant,因为缺少时区。所以你总是可以得到默认的
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String timestamp = "2016-02-16 11:00:02";
TemporalAccessor temporalAccessor = formatter.parse(timestamp);
LocalDateTime localDateTime = LocalDateTime.from(temporalAccessor);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
Instant result = Instant.from(zonedDateTime);
【讨论】:
顺便说一句,我最近需要在不知道确切格式的情况下将字符串解析为日期,基本上尝试解析任何表示有效日期的字符串。所以我写了一篇关于我如何解决这个问题的文章。这是链接:linkedin.com/pulse/…【参考方案3】:我写了这么简单的函数来执行转换:
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.sql.Timestamp;
public class SqlTimestampParser
public static Timestamp parseTimestamp(String dateTime, String format) throws Exception
if (format == null || format.trim().length() == 0)
throw new Exception("No format defined!");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
ZonedDateTime timed = ZonedDateTime.parse(dateTime, formatter);
timed.format(formatter);
Instant x = Instant.from(timed);
return Timestamp.from(x);
附样本用法:
SqlTimestampParser.parseTimestamp('2020-09-17 16:20:35.294000+00:00',"yyyy-MM-dd HH:mm:ss.SSSSSSXXX")
【讨论】:
【参考方案4】:首先使用日期格式将您的日期转换为实用日期,因为您的输入中没有时区。然后您可以将该日期转换为即时日期。这将为您提供准确时间的日期。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timestamp = "2016-02-16 11:00:02";
Date xmlDate = dateFormat.parse(timestamp);
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Instant instantXmlDate = Instant.parse(dateFormat.format(xmlDate));
【讨论】:
如果已经有明显更好的替代方案,请不要提出本质上不安全的遗留 API。以上是关于将字符串时间戳解析为即时抛出不受支持的字段:InstantSeconds的主要内容,如果未能解决你的问题,请参考以下文章