相当于java

时间:2017-12-16 13:10:27

标签: javascript java date

可能不是最具挑战性的问题,但我正在使用以下日期格式进行战斗: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中解析这种格式?

3 个答案:

答案 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字符串......