Java将19位Unix时间戳转换为可读日期

Java将19位Unix时间戳转换为可读日期,java,unix-timestamp,datetime-conversion,Java,Unix Timestamp,Datetime Conversion,我正在尝试将19位Unix时间戳(如155843950471000000(一个半)转换为可读的日期/时间格式。我的时间戳以6个零结束,这表明时间是以纳秒为单位的 我遇到过一些例子,人们使用我不需要的时区。另一个示例使用了ofEpochSecond,如下所示: Instant instant = Instant.ofEpochSecond(seconds, nanos); 但我不确定是否需要使用每秒 下面的代码给出了我实现这一目标的最新方法: String timeStamp = "155843

我正在尝试将19位Unix时间戳(如
155843950471000000
(一个半)转换为可读的日期/时间格式。我的时间戳以6个零结束,这表明时间是以纳秒为单位的

我遇到过一些例子,人们使用我不需要的时区。另一个示例使用了ofEpochSecond,如下所示:

Instant instant = Instant.ofEpochSecond(seconds, nanos);
但我不确定是否需要使用每秒

下面的代码给出了我实现这一目标的最新方法:

String timeStamp = "1558439504711000000";
long unixNanoSeconds = Long.parseLong(timeStamp);
Date date = new java.util.Date(timeStamp*1000L); 
// My preferred date format
SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy HH:mm:ss");                    
String formattedDate = sdf.format(date);
System.out.println("The timestamp in your preferred format is: " +  formattedDate); 
但我得到的结果是这样的:

// The timestamp in your preferred format is: 11-12-49386951 11:43:20

它不显示年份格式,例如2019年格式。

我认为这没有问题,您处理的是表示未来日期的时间戳(未来非常遥远的日期)

如果你考虑这个:

String timeStamp=“1558439504”

这将为您提供:2019年5月21日上午11:51(UTC)

然后我想有一个简单的方法来确定日期。只需首先基于该时间戳创建即时,然后执行以下操作:

Date myDate = Date.from(instant);

我认为这没什么错,您正在处理一个表示未来日期的时间戳(一个非常遥远的未来日期)

如果你考虑这个:

String timeStamp=“1558439504”

这将为您提供:2019年5月21日上午11:51(UTC)

然后我想有一个简单的方法来确定日期。只需首先基于该时间戳创建即时,然后执行以下操作:

Date myDate = Date.from(instant);
试试这个

Date date = new java.util.Date(timeStamp/1000000); 
不要乘以1000,而要除以1000000

Date date = new java.util.Date(timeStamp/1000000); 
不是乘以1000,而是除以1000000

tl;博士 永远不要使用遗留类
java.util.Date
。相反,使用现代的

21-05-2019 12:51:44

……或者

Instant
.ofEpochSecond (
    TimeUnit.NANOSECONDS.toSeconds( 
       Long.parse( "1558439504711000000" ) 
    ) ,
    ( 1_558_439_504_711_000_000L % 1_000_000_000L )
)
.toString()
2019-05-21T11:51:44.711Z

请注意时差,因为时区比UTC早一小时

避免遗留日期时间类
java.util.Date
类很糟糕。连同它的同龄人,如
Calendar
&
SimpleDateFormat
,它们简直是一团糟。避开它们。Sun、Oracle和JCP社区在采用JSR 310时放弃了它们

Instant
java.util.Date
对象表示中的一个时刻,分辨率为。它的替换也是UTC的一个时刻,但分辨率为。在内部,两者都跟踪自的计数

为了避免处理庞大的数字,内部的
瞬间
跟踪自1970年以来的整秒数加上以纳秒为单位保留的小数秒数。两个独立的数字。这些是你需要喂养的东西

使用类将输入字符串解析为
long
。顺便说一下,请注意,您的值正在向整数的方向推进

使用来做分割整秒的数学运算

long secondsPortion = TimeUnit.NANOSECONDS.toSeconds( totalNanos ) ;
10亿,剩下的是分数秒的纳秒

long nanosPortion = ( totalNanos % 1_000_000_000L ) ;
Instant instant = Instant.ofEpochSecond( 0L , 1_558_439_504_711_000_000L ) ;
实例化一个
即时

Instant instant = Instant.ofEpochSecond( secondsPortion , nanosPortion ) ;
我的时间戳以6个零结束,这表明时间是以纳秒为单位的

事实上,纳秒数到十亿,所以九(9)位数不是六(6)位数。从epoch开始的计数中的小数秒是
711000000
,或711000000纳秒。您的整秒数是1558439504或1558439504(15亿)。十进制:

自1970-01-01T00:00Z起1558439504.711000000秒

时区 我遇到过一些例子,人们使用我不需要的时区

要表示时间轴上的某个特定点,您始终需要一个(或数小时分秒)

要通过某个特定地区(时区)的人使用的挂钟时间查看同一时刻,请应用a获取a

大陆/地区
的格式指定,例如
美国/蒙特利尔
非洲/卡萨布兰卡
,或
太平洋/奥克兰
。切勿使用2-4个字母的缩写,如
BST
EST
IST
,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)

2019-05-21T12:51:44.711+01:00[欧洲/伦敦]

请注意每天时间的调整,从11小时到12小时。这是有道理的,因为
欧洲/伦敦
区域在该日期比UTC提前一小时。同一时刻,时间线上的同一点,不同的挂钟时间

捷径 正如Ole V.V.在评论中指出的,您可以跳过上面讨论的数学。将整个纳秒数作为第二个参数输入到
ofEpochSecond
。该类在内部进行数学运算,将整秒与小数秒分开

long nanosPortion = ( totalNanos % 1_000_000_000L ) ;
Instant instant = Instant.ofEpochSecond( 0L , 1_558_439_504_711_000_000L ) ;
看到这个了吗

生成文本 以标准格式生成表示该
ZonedDateTime
值的文本,该格式扩展为将时区名称附加在方括号中

String output = zdt.toString() ;
2019-05-21T12:51:44.711+01:00[欧洲/伦敦]

或者让java.time为您自动本地化

Locale locale = Locale.UK;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( locale );
String output = zdt.format( f );
2019年5月21日,12:51

或指定自定义格式

Locale locale = Locale.UK;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" , locale ) ;
String output = zdt.format( f );
21-05-2019 12:51:44

提示:在不明确指定区域的情况下,提供日期时间时要非常小心。这会产生歧义,用户可能会假定存在不同的区域/偏移

tl;博士 永远不要使用遗留类
java.util.Date
。相反,使用现代的

21-05-2019 12:51:44

……或者

Instant
.ofEpochSecond (
    TimeUnit.NANOSECONDS.toSeconds( 
       Long.parse( "1558439504711000000" ) 
    ) ,
    ( 1_558_439_504_711_000_000L % 1_000_000_000L )
)
.toString()
2019-05-21T11:51:44.711Z

请注意时差,因为时区比UTC早一小时

避免遗留日期时间类
java.util.Date
类很糟糕。连同它的同龄人,如
Calendar
&
SimpleDateFormat
,它们简直是一团糟。避开它们。Sun、Oracle和JCP社区在采用JSR 310时放弃了它们

Instant
A
java.util.Date
objectr