【问题标题】:convert nanoseconds(100 nanoseconds unit) to filetime and view as date in java [duplicate]将纳秒(100纳秒单位)转换为文件时间并在java中查看为日期[重复]
【发布时间】:2020-09-13 16:25:48
【问题描述】:

纳秒值130016196641685504

预期结果:2013 年 1 月 2 日星期三下午 5:01:04

此代码的输出:1974-02-14 01:06:36

   FileTime time = FileTime.from(nanoSeconds,TimeUnit.NANOSECONDS);
   String pattern = "yyyy-MM-dd HH:mm:ss";
   SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
   Date date = new Date(time.toMillis());
   System.out.println(simpleDateFormat.format(date));

更具体地说,我正在尝试将纳秒转换为 java 中的 humanReadable 格式。更多详情请参考link...

【问题讨论】:

  • 我已作为副本关闭。当我将您的值 130016196641685504 插入到原始问题和答案的代码中时,我得到2013-01-02T17:01:04.168550400Z,这似乎与您的预期一致。
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用InstantDateTimeFormatter 和来自java.time, the modern Java date and time API 的其他类。
  • @OleV.V.谢谢,它工作得很好,谢谢....

标签: java datetime time timestamp


【解决方案1】:

您为什么预计 2013 年 1 月 2 日星期三下午 5:01:04?

阅读规范

Parameters:
value - the value since the epoch (1970-01-01T00:00:00Z); can be negative

https://docs.oracle.com/javase/8/docs/api/java/nio/file/attribute/FileTime.html#from-long-java.util.concurrent.TimeUnit-

而 130016196641685504 大约是 4 年。

所以你的期望是错误的。

【讨论】:

  • silisoftware.com/tools/… 参考这个链接,这个转换是如何工作的?
  • 但是您使用的是 java FileTime.from 库,请阅读该规范。就像您正在使用纽约市芝加哥的地图。
  • 谢谢,有没有办法在java中进行上述转换?
  • 不知道 silisoftware 如何实现他们的转换。但是为什么你认为 130016196641685504 应该给你 2013 年 1 月 2 日星期三下午 5:01:04 就像我告诉你 10 + 30 是 42,然后你尝试让 java 来计算它。您将无法使用标准库来做到这一点,因为它在说谎。但是您很可能自己对其进行逆向工程...
【解决方案2】:

tl;博士

根据comment by Ole V.V.original Question,您的输入是一个编码值。不是纳米的计数。

以纳秒为单位乘以十

如果您的组计数为 100 纳秒,则乘以十 (10) 得到纳秒计数。

long input = 130_016_196_641_685_504L ;
long nanos = input * 10 ;

转换为Instant

Instant instant = Instant.EPOCH.plus( nanos , ChronoUnit.NANOS ) ;

instant.toString(): 2011-03-15T04:06:06.416855040Z

130_016_196_641_685_504L 的示例输入乘以 10 表示自 1970 UTC 第一时刻的纪元引用导致 2011-03-15T04:06:06.416855040Z 以来的纳秒计数。

您的期望无效

我怀疑您的期望不正确。您应该编辑您的问题以解释您期望的原因。

您对2013-02-14T17:01:04Z 的预期结果实际上是自 1970 UTC 第一时刻以来的纳秒计数:1360861264000000000

LocalDate ld = LocalDate.of( 2013 , Month.FEBRUARY , 14 ) ;
LocalTime lt = LocalTime.of( 17 , 1 , 4 ) ;
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
long output = Duration.between( Instant.EPOCH , odt.toInstant() ).toNanos() ;

查看类似的code run live at IdeOne.com

也许您错误地假设输入数据的发布者使用的纪元参考。 Dozens of various epoch references被各种信息系统使用。

➥ 或者更有可能的是,您的输入不是来自纪元的纳秒计数,而是编码为commented by Ole V.V. 的值,将由linked Question 上的代码解码。

【讨论】:

  • 2013 年 1 月 2 日星期三下午 5:01:04 仍然无法完成
  • 嗨,谢谢您的回复,silisoftware.com/tools/… 参考这个链接,这个转换是如何工作的?
  • 这与您的问题无关。问silisoftware.com我们怎么知道!据我们所知,他们可以拥有用自己的语言实现的自己的数据时间库。我们确实知道他们不使用 java 中的 FileTime.from()
猜你喜欢
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2017-04-06
  • 2017-10-17
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多