无法将字符串转换为ZonedDateTime:DateTimeParseException

时间:2017-06-11 18:04:40

标签: java json datetime-parsing zoneddatetime

我尝试将字符串从JSON转换为ZonedDateTime,就像

一样
static String getWatchTime(JSONObject aJson, JSONObject bJson) {
    long difference = 0 ;
    try {
        String aTime = aJson.getString("time_utc_8");
        String bTime = bJson.getString("time_utc_8");

        String pattern = "yyyy-MM-dd HH:mm:ss.SSSSSS";
        DateTimeFormatter Parser = DateTimeFormatter.ofPattern(pattern).ISO_DATE;

        System.out.println(aTime);

        ZonedDateTime a = ZonedDateTime.parse(aTime, Parser);
        ZonedDateTime b = ZonedDateTime.parse(bTime, Parser);

        ChronoUnit unit = null;
        difference = unit.between(a, b);

        System.out.println(difference);

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    String t = difference +"";
    return t;

}

并始终收到错误

Exception in thread "main" java.time.format.DateTimeParseException: Text '2016-06-28 22:29:44.700228' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {},ISO resolved to 2016-06-28T22:29:44.700228 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(Unknown Source)
at java.time.format.DateTimeFormatter.parse(Unknown Source)
at java.time.OffsetDateTime.parse(Unknown Source)
at Q2.getWatchTime(Q2.java:321)
at Q2.WatchTime(Q2.java:265)
at Q2.main(Q2.java:31)

我想了解这两个日期之间的区别。 我已经尝试了SimpleDateFormat但是它会得到错误的结果,对于工厂来说。

2 个答案:

答案 0 :(得分:5)

我认为评论已经全部,所以这只是总结一下。

(1)您的格式模式字符串是正确的。您只需从以下行中删除.ISO_DATE,即成为:

          DateTimeFormatter Parser = DateTimeFormatter.ofPattern(pattern);

ISO_DATE接受例如'2011-12-03 + 01:00'或'2011-12-03',没有时间的日期,有或没有与UTC的偏移;你没有任何东西据我所知,在这里使用它。)

(2)由于您的字符串似乎既没有时区也没有偏移,请使用LocalDateTime

          LocalDateTime a = LocalDateTime.parse(aTime, Parser);
          LocalDateTime b = LocalDateTime.parse(bTime, Parser);

如果您在计算差异时需要考虑夏令时(DST)等,请在解析后转换时间:

          ZoneId timeZone = ZoneId.systemDefault();
          ZonedDateTime a = LocalDateTime.parse(aTime, Parser).atZone(timeZone);
          ZonedDateTime b = LocalDateTime.parse(bTime, Parser).atZone(timeZone);

请仔细考虑用于转换的时区,以确保获得预期结果。

(3)ChronoUnit的{​​{1}}将无效。我不知道你想要哪一个,所以这个选项是随机挑选的:

null

通过这三项更改,您的方法可以很好地在我的计算机上执行。在一次运行中打印出来:

          ChronoUnit unit = ChronoUnit.DAYS;

在同一次运行中,它返回了一串2016-06-28 22:29:44.700228 365

答案 1 :(得分:3)

我得到安德烈亚斯的回答(评论中) 我用这段代码最终实现了我的目标

    static String getWatchTime(JSONObject aJson, JSONObject bJson) {
    double difference = 0 ;
    try {
        String aTime = aJson.getString("time_utc_8");
        String bTime = bJson.getString("time_utc_8");

          String pattern = "yyyy-MM-dd HH:mm:ss.SSSSSS";
          DateTimeFormatter Parser = DateTimeFormatter.ofPattern(pattern).withZone(ZoneId.systemDefault());

          System.out.println(aTime);


          ZonedDateTime a = ZonedDateTime.parse(aTime,Parser);
          ZonedDateTime b = ZonedDateTime.parse(bTime,Parser);

          System.out.println(a);
          System.out.println(b);
          //ChronoUnit unit = null ;
          difference = ChronoUnit.MICROS.between(a, b);


    } catch (JSONException e) {
        e.printStackTrace();
    } /*catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }*/

    String t = difference +"";
    return t;

}

我没有设置TimeZone,因此无法将输入转换为ZonedDateTime。 我需要得到微秒,因此我使用ChronoUnit.MICROS.between() 谢谢你的回答