将unix time / utc转换为特定时区

时间:2014-05-26 17:45:14

标签: java jodatime

我有当前的毫秒utc / unix时间,现在我想将其转换为特定时区的日期时间,例如EST UTC -5(纽约)。

我使用以下方法获取当前的毫秒/单位时间

System.currentTimeMillis

现在我想将这个长值转换为特定的时区。

我怎么能用Joda时间做到这一点,因为我听说这是最好的库,但API对我来说似乎有点混乱。

2 个答案:

答案 0 :(得分:1)

您可以使用DateTime(long),然后使用DateTime.withZone(DateTimeZone)。像

这样的东西
DateTime dt = new DateTime(millis).withZone(DateTimeZone.forID("Europe/Somewhere");

答案 1 :(得分:0)

  

我使用以下命令获取当前的毫秒/ Unix时间:System.currentTimeMillis

请勿执行此操作。

Instant.now()方法替换了该过时的方法。此外,Instant的粒度更细,可达纳秒。目前,OpenJDK中的实现以毫秒为单位捕获当前时刻,比其他方法的毫秒数要精确得多。

Instant instant = Instant.now() ;
  

instant.toString():2019-07-27T02:15:34.727766Z

     

现在我想将此long值转换为特定的时区。

将您的时区指定为ZoneId。应用于Instant以获得ZonedDateTime

ZoneId z = ZoneId.of( "America/New_York" ) ;  // Or did you have another zone in mind, such as `America/Montreal` ?
ZonedDateTime zdt = instant.atZone( z );

或者,您可以跳过Instant。传递ZonedDateTime.now时呼叫ZoneId

ZonedDateTime zdt = ZonedDateTime.now( z ) ;
  

特定时区,例如EST UTC -5(纽约)。

EST不是真正的时区。

Continent/Region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

  

如何用Joda time做到这一点,因为我听说这是最适合使用的库,但是API似乎让我有些困惑。

Joda-Time 项目现在由JSR 310定义的Java 8及更高版本中内置的 java.time 类继承。Android 26及更高版本具有这些类太。

您评论有关写入数据库的信息。如果您的数据库具有正确的日期时间类型,请使用它们,而不要存储一个长整数。

从JDBC 4.2开始,我们可以与数据库交换 java.time 对象。

像我们这里讨论的那样,应该存储在类似于SQL标准类型TIMESTAMP WITH TIME ZONEWITH not {{ 1}}!)。

奇怪的是,JDBC规范仅要求支持WITHOUT而不是OffsetDateTimeInstant。因此,转换。

ZonedDateTime

检索。

myPreparedStatement.setObject( … , zdt.toOffsetDateTime() ) ;

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ; ZoneId z = ZoneId.of( "America/Montreal" ) ; ZonedDateTime zdt = odt.atZoneSameInstant( z ) ; // Adjust to a time zone. Instant instant = zdt.toInstant() ; // Adjust to UTC. OffsetDateTime有什么区别?

  • 与UTC的偏移量仅为数小时-数分钟-秒。没什么。
  • 一个时区还有很多 。时区是特定区域的人们过去,现在和将来对偏移量的更改的历史。

enter image description here