Parse String timestamp to Instant throws Unsupported field:InstantSeconds

时间:2016-02-24 18:52:59

标签: java parsing timestamp java-8

我正在尝试将String转换为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 Update 72。

4 个答案:

答案 0 :(得分:20)

以下是使用默认时区获取即时消息的方法。您的String无法直接解析为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);

答案 1 :(得分:11)

更简单的方法是在声明

时将默认时区添加到formatter对象
final DateTimeFormatter formatter = DateTimeFormatter
                                    .ofPattern("yyyy-MM-dd HH:mm:ss")
                                    .withZone(ZoneId.systemDefault());
Instant result = Instant.from(formatter.parse(timestamp));

答案 2 :(得分:0)

首先使用日期格式将日期转换为使用日期,因为您的输入中没有时区。然后,您可以将该日期转换为即时日期。这样可以给您准确的日期。

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));

答案 3 :(得分:0)

我编写了一个简单的函数来执行转换:

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")