可能不是最具挑战性的问题,但我正在使用以下日期格式进行战斗:1513428679.1184669
在js中工作正常:
var s = 1513429108.7141557;
var date = new Date(0);
date.setUTCSeconds(s);
-> Sat Dec 16 2017 13:58:28 GMT+0100 (CET)
但我如何在Java中解析这种格式?
答案 0 :(得分:2)
由于double
值仅为纪元以来的秒数,因此转换很容易:
double d = 1513429108.7141557;
// Using old Java Date
Date date = new Date((long) d * 1000);
SimpleDateFormat fmt = new SimpleDateFormat("EEE MMM d yyyy HH:mm:ss 'GMT'XX (z)");
fmt.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));
System.out.println(fmt.format(date));
// Using Java 8 Time API with formatter applying time zone
Instant instant = Instant.ofEpochSecond((long) d, (long) d * 1000000000 % 1000000000);
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("EEE MMM d yyyy HH:mm:ss 'GMT'xx (z)")
.withZone(ZoneId.of("Europe/Paris"));
System.out.println(fmt.format(instant));
// Using Java 8 Time API with timezoned date value
ZonedDateTime dateTime = Instant.ofEpochSecond((long) d, (long) d * 1000000000 % 1000000000)
.atZone(ZoneId.of("Europe/Paris"));
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("EEE MMM d yyyy HH:mm:ss 'GMT'xx (z)");
System.out.println(dateTime.format(fmt));
我会推荐第三个选项,使用ZonedDateTime
。
打印所有3个选项:
Sat Dec 16 2017 13:58:28 GMT+0100 (CET)
答案 1 :(得分:1)
这会让你走近:
double utcSeconds = 1513429108.7141557;
long longSeconds = (long) utcSeconds;
long nanos = Math.round((utcSeconds - longSeconds) * 1_000_000_000L);
Instant inst = Instant.ofEpochSecond(longSeconds, nanos);
System.out.println(inst);
打印:
2017-12-16T12:58:28.714155674Z
Instant
的打印隐式调用Instant.toString()
,它总是以UTC格式生成一个字符串。因此,当这说12:58:28,它同意你在GMT + 0100(CET)的13:58:28。最后的小数是不准确的。当比较双倍的小数时,似乎时间是在12:58:28.714155700的正确时间之前26纳秒。这来自double
的精度有限,因此要问两个纳秒值中的哪一个更正确是没有意义的。
答案 2 :(得分:0)
试试这个简单的代码
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String utcTime = sdf.format(new Date());
Date date = sdf.parse(utcTime);
String utcSecond = date.getSeconds();
您正在寻找的是utcSecond字符串......