Java将19位Unix时间戳转换为可读日期
我正在尝试将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
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,而是除以1000000tl;博士
永远不要使用遗留类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
Ajava.util.Date
objectr