Joda DateTime getMillis() 对于 UTC 不正确,而是返回本地毫秒

问题描述 投票:0回答:3

我试图获取 UTC 毫秒将 Joda

DateTime
实例 转换为 SQL Timestamp,但它会将其转换为我的本地时间。

这是一个例子:

DateTime d = DateTime.now().withZone(DateTimeZone.UTC);
Timestamp t = new Timestamp(d.getMillis());
System.out.println(t);
t.setHours(d.getHourOfDay());
System.out.println(t);

输出:

2015-04-17 18:11:27.277
2015-04-17 22:11:27.277

为什么要转换为我当地的时区? 我认为

DateTime.getMillis()
方法总是返回 UTC 的毫秒数?

java jodatime
3个回答
4
投票

更改时间时,不会更改自纪元以来的毫秒数。换句话说,调用

withZone
实际上并不会改变底层的
long millis

真正的问题是

Timestamp.setHours
方法,该方法自 Java 1.1 起已被弃用。请参阅文档:

@已弃用

公共无效setHours(int小时)

已弃用。从 JDK 版本 1.1 开始,由

Calendar.set(Calendar.HOUR_OF_DAY, int hours)
取代。 将此 Date 对象的小时设置为指定值。此 Date 对象经过修改,使其表示一天中指定小时内的时间点,其中年、月、日、分、秒与之前相同,按照本地时区进行解释。


1
投票

试试这个:

DateTimeZone.setDefault(DateTimeZone.UTC);
DateTime d = DateTime.now();
Timestamp t = new Timestamp(d.getMillis());
System.out.println(t);
t.setHours(d.getHourOfDay());
System.out.println(t);

0
投票

tl;博士

ZonedDateTime.now()

Instant

Joda-Time 库已被 Java 8 及更高版本中内置的 java.time 类取代。

使用

DateTime
 代替 
java.time.Instant
类来表示 UTC 中的时刻(零小时-分钟-秒的偏移量)。

Instant now = Instant.now() ;

ZonedDateTime

您可以通过特定时区的挂钟/日历进行调整以查看该时刻。使用

ZonedDateTime
类。

ZoneId z = ZoneId.of( "America/Edmonton" ) ;  // Or ZoneId.systemDefault()
ZonedDateTime zdt = now.atZone( z ) ;

或者跳过

Instant
并直接将当前时刻捕获为
ZonedDateTime
对象。

ZonedDateTime zdt = ZonedDateTime.now( z ) ;
© www.soinside.com 2019 - 2024. All rights reserved.