我试图获取 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 的毫秒数?
更改时间时,不会更改自纪元以来的毫秒数。换句话说,调用
withZone
实际上并不会改变底层的 long millis
。
真正的问题是
Timestamp.setHours
方法,该方法自 Java 1.1 起已被弃用。请参阅文档:
@已弃用
公共无效setHours(int小时)
已弃用。从 JDK 版本 1.1 开始,由
取代。 将此 Date 对象的小时设置为指定值。此 Date 对象经过修改,使其表示一天中指定小时内的时间点,其中年、月、日、分、秒与之前相同,按照本地时区进行解释。Calendar.set(Calendar.HOUR_OF_DAY, int hours)
试试这个:
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);
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 ) ;