我正在尝试将带有偏移量(int)的Long
时间戳转换为更易读的格式。例如,我将1514564669355
作为时间戳,其偏移量等于360
。我应该如何使用java将其转换为等效的日期格式?
在这种情况下,时间戳将以UTC格式存储,因此我希望将偏移量转换为所需的时区。感谢您的任何帮助/提示。
答案 0 :(得分:4)
您的问题不明确。
首先解析输入的数字。我们假设这个数字是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-UTC是UTC之前或之后的小时,分钟和秒数。
也许你的问题提到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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。