【问题标题】:Joda DateTime getMillis() for UTC is incorrect, returning local milliseconds insteadUTC 的 Joda DateTime getMillis() 不正确,而是返回本地毫秒
【发布时间】:2015-04-18 06:32:26
【问题描述】:

我正在尝试获取 UTC 毫秒以将 Joda DateTime instance 转换为 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


【解决方案1】:

当您更改时间时,您不会更改自纪元以来的毫秒数。换句话说,调用withZone 并不会真正改变底层的long millis

真正的问题是Timestamp.setHours 方法,该方法自Java 1.1 以来已被弃用。请参阅文档:

@已弃用

public void setHours(int hours)

已弃用。 从 JDK 1.1 版开始,由 Calendar.set(Calendar.HOUR_OF_DAY, int hours) 取代。 将此 Date 对象的小时设置为指定值。修改此 Date 对象,使其表示一天中指定小时内的时间点,年、月、日、分和秒与以前相同,按本地时区解释。

【讨论】:

    【解决方案2】:

    试试这个:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2017-12-16
      • 2017-08-21
      • 2013-01-03
      • 2023-03-15
      相关资源
      最近更新 更多