Java:将Long Timestamp + int offset转换为可读格式

时间:2018-05-08 16:29:29

标签: java timestamp timezone-offset

我正在尝试将带有偏移量(int)的Long时间戳转换为更易读的格式。例如,我将1514564669355作为时间戳,其偏移量等于360。我应该如何使用java将其转换为等效的日期格式?

在这种情况下,时间戳将以UTC格式存储,因此我希望将偏移量转换为所需的时区。感谢您的任何帮助/提示。

1 个答案:

答案 0 :(得分:4)

您的问题不明确。

  • 也许您的意思是您拥有UTC值,并希望将其调整为UTC之前360分钟的偏移量。 (一种不好的方式及时沟通。)
  • 或许您的意思是给定值已经超过UTC。 (更糟糕的是,及时传达一个时刻。)

以UTC

开头

首先解析输入的数字。我们假设这个数字是1970年UTC 1970-01-01T00:00Z的第一个时刻以来的毫秒数。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = Instant.ofEpochMilli( 1_514_564_669_355L ) ;
  

instant.toString():2017-12-29T16:24:29.355Z

offset-from-UTCUTC之前或之后的小时,分​​钟和秒数。

也许你的问题提到360的偏移量是360分钟,比UTC早6小时。

ZoneOffset类无法在59分钟内实例化。所以我们将从360分钟转换为总秒数。

int seconds = ( int ) TimeUnit.MINUTES.toSeconds( 360L ) ;  // Convert minutes to seconds.
ZoneOffset offset = ZoneOffset.ofTotalSeconds( seconds );   // Determine offset-from-UTC.
  

offset.toString():+ 06:00

将UTC中的Instant调整为此偏移量,产生OffsetDateTime个对象。同一时刻,时间轴上的同一点,不同的挂钟时间。所以时间被视为晚上10点而不是下午4点(16 + 6)= 22。

    OffsetDateTime odt = instant.atOffset( offset );
  

odt.toString():2017-12-29T22:24:29.355 + 06:00

以偏移量

开头

也许您的意思是传达的时刻是UTC的毫秒数,但是已经增加或减去了360分钟内的毫秒数。

顺便说一句,这是交换日期时间值的一种非常糟糕的方式。向您的数据供应商提供有关ISO 8601标准的信息。

让我们撤消偏移的加/减,以回到UTC。

long millisInOffset = TimeUnit.MINUTES.toMillis( 360L );  // Convert minutes to milliseconds.
long millisSinceEpoch = ( 1_514_564_669_355L - millisInOffset );
Instant instant = Instant.ofEpochMilli( millisSinceEpoch );
  

instant.toString():2017-12-29T10:24:29.355Z

在发送给我们的偏移量中查看该值。

int seconds = ( int ) TimeUnit.MILLISECONDS.toSeconds( millisInOffset );
ZoneOffset offset = ZoneOffset.ofTotalSeconds( seconds );
OffsetDateTime odt = instant.atOffset( offset );
System.out.println( odt );
  

2017-12-29T16:24:29.355 + 06:00

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore