我有当前的毫秒utc / unix时间,现在我想将其转换为特定时区的日期时间,例如EST UTC -5(纽约)。
我使用以下方法获取当前的毫秒/单位时间
System.currentTimeMillis
现在我想将这个长值转换为特定的时区。
我怎么能用Joda时间做到这一点,因为我听说这是最好的库,但API对我来说似乎有点混乱。
答案 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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
如何用Joda time做到这一点,因为我听说这是最适合使用的库,但是API似乎让我有些困惑。
Joda-Time 项目现在由JSR 310定义的Java 8及更高版本中内置的 java.time 类继承。Android 26及更高版本具有这些类太。
您评论有关写入数据库的信息。如果您的数据库具有正确的日期时间类型,请使用它们,而不要存储一个长整数。
从JDBC 4.2开始,我们可以与数据库交换 java.time 对象。
像我们这里讨论的那样,应该存储在类似于SQL标准类型TIMESTAMP WITH TIME ZONE
(WITH
, not {{ 1}}!)。
奇怪的是,JDBC规范仅要求支持WITHOUT
而不是OffsetDateTime
或Instant
。因此,转换。
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
有什么区别?