在java语言中,如何将纳秒值(例如1568694302232954486和156870352136049938)转换为java日期对象?

在java语言中,如何将纳秒值(例如1568694302232954486和156870352136049938)转换为java日期对象?,java,datetime,timestamp,logstash-file,Java,Datetime,Timestamp,Logstash File,我有很多长的数字,看起来像1568694302232954486和1568703521360049938,我需要将它们转换成一个Java日期对象 如何在Java8中实现上述需求? 我还需要将纳秒值转换为elasticsearch的时间戳,并找到正确的方法;谢谢你的帮助 下面的代码块已通过测试,仅供需要它的用户使用。它实际上是日志存储配置文件的一部分: ruby { init => "" code => " eve

我有很多长的数字,看起来像1568694302232954486和1568703521360049938,我需要将它们转换成一个Java日期对象

如何在Java8中实现上述需求? 我还需要将纳秒值转换为elasticsearch的时间戳,并找到正确的方法;谢谢你的帮助

下面的代码块已通过测试,仅供需要它的用户使用。它实际上是日志存储配置文件的一部分:

ruby {
            init => ""
            code => "
            event.set('time_local',event.get('time_local').to_f*0.000001)
            "
        }

        date {
                #15/Aug/2019:14:46:19 +0800 [02/Sep/2019:09:28:33 +0800]
            match => [ "time_local" , "yyyy-MM-dd HH:mm:ss,SSS","UNIX_MS"]
            timezone => "Asia/Shanghai"
            target => "@timestamp"
        }

如果希望将其作为
Date
对象,则会丢失一些信息,因为
Date
的精度只有毫秒<代码>日期<代码>在java 8中也过时了,所以如果你使用java 8或以上,考虑使用<代码>即时< /代码>。 下面是如何转换为
日期
。除非你真的必须这样做,否则不要这样做

另一方面,
Instant
具有纳秒精度,这是您应该做的:

// 1000000000 is how many nanoseconds there are in a second.
Instant i = Instant.ofEpochSecond(nano / 1000000000, nano % 1000000000);
java.time 如果你知道怎么做,这很容易。虽然两个参数的第二个参数
Instant.ofEpochSecond()
命名为
nanoAdjustment
,但它的类型为
long
,并且该方法接受在该参数中传递的完整nano值。因此,只需将0作为秒传递,并将转换留给方法:

    Instant instant1 = Instant.ofEpochSecond(0, 1_568_694_302_232_954_486L);
    System.out.println(instant1);
    Instant instant2 = Instant.ofEpochSecond(0, 1_568_703_521_360_049_938L);
    System.out.println(instant2);
输出为:

如果您确实需要一个旧式的
Date
对象,用于无法更改或现在不想升级的旧API:

    Date oldfashionedDate1 = Date.from(instant1);
    System.out.println(oldfashionedDate1);
在我的计算机上,转换后的
日期打印为:

不过,通常要避免使用
Date
类。它设计拙劣,早已过时。使用现代java日期和时间API java.time要好得多


链接:解释如何使用java.time。

预期结果是什么
2019年9月17日星期二04:25:02 GMT
对于
1568694302232954486
?请注意
Date
已过时,尽管您可能会遇到使用它的旧库。您是指
即时对象吗?如果您在
日期之后
,则您没有使用Java 8。输出日期格式字符串(如yyyy-mm-dd hh:mm:ss)的Ruby转换代码段也是可以接受的。@Joachim Isaksson是的,2019年9月17日星期二04:25:02 GMT可以,谢谢,代码段是什么?
2019-09-17T04:25:02.232954486Z
2019-09-17T06:58:41.360049938Z
    Date oldfashionedDate1 = Date.from(instant1);
    System.out.println(oldfashionedDate1);
Tue Sep 17 06:25:02 CEST 2019