Java SimpleDateFormat无法正确解析(我使用正确的大写/小写字母..)

时间:2017-11-23 10:54:36

标签: java parsing time simpledateformat

我知道这已被问过好几次了,我冒着一个downvote / duplicate close的风险,但是这里发布的大部分问题都是通过将YYYY追成yyyy来解决的。所以,搜索并没有真正帮助:/

这些是块内的给定时间戳

date new Block: 2017-11-02T06:17:05.079481
date old Block: 2017-11-02T06:17:04.608960

我的转换代码:

 public static Date getDate(JSONObject block){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS");
    try {
       return sdf.parse(block.get("timestamp").toString());
    } catch (ParseException e) {
        e.printStackTrace();
        return new Date(0);
    }
}

这是解析的结果

date new block: Thu Nov 02 06:18:24 KST 2017 
date old block: Thu Nov 02 06:27:12 KST 2017

怎么可能?新块是在旧块之后创建的,如时间戳中所示。但现在是另一种方式

2 个答案:

答案 0 :(得分:1)

关注Jon Skeet’s knowledgable answer,使用java.time并不难。 JSON块的日期时间格式是ISO 8601,交换日期和时间数据的标准格式,java.time类将此格式解析为默认格式,即无需显式格式:

    String blockTimestamp = "2017-11-02T06:17:05.079481";
    LocalDateTime dateTime = LocalDateTime.parse(blockTimestamp);

如果您尝试打印生成的dateTime,您将再次看到其默认格式ISO 8601,因为这也是其toString方法生成的内容:2017-11-02T06:17:05.079481

LocalDateTime的潜在缺点是它并不代表时间轴上的明确点。因此,如果您知道在哪个时区解释日期和时间,您可能希望将其转换为ZonedDateTime,例如:

    ZoneId koreaTimeZone = ZoneId.of("Asia/Seoul");
    ZonedDateTime koreaDateTime = dateTime.atZone(koreaTimeZone);

这会产生2017-11-02T06:17:05.079481+09:00[Asia/Seoul]

答案 1 :(得分:-1)

在简单日期格式中,您需要将'DD'更改为小写'dd'

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS");

这有望解决您的问题。

编辑:小时数也是如此。 ** 将**'HH'替换为'hh'(小写)。

由于