我知道这已被问过好几次了,我冒着一个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
怎么可能?新块是在旧块之后创建的,如时间戳中所示。但现在是另一种方式
答案 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'(小写)。
由于