将字符串时间戳解析为即时抛出不受支持的字段: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的主要内容,如果未能解决你的问题,请参考以下文章

从文件末尾寻找抛出不受支持的异常

.net两个对象比较,抛出不一样字段的结果

循环 IEnumerable<T> 抛出不支持的异常

MySQL抛出不正确的字符串值错误

jason有一个字符串字段为null,因此Jackson解析器抛出错误

为啥 collections.sort 在 Java 中按比较器排序时会抛出不支持的操作异常?