【问题标题】:Joda's DateTime is inconsistent with java.util.CalendarJoda 的 DateTime 与 java.util.Calendar 不一致
【发布时间】:2015-11-30 10:16:23
【问题描述】:

我使用以下代码来检查 joda 的 DateTime 和 java.util.Calendar 之间的一致性。这个结果是正确的,但是如果我将 2000 年更改为 1900 年,那么我将得到 2 个不同的结果。这是一个错误还是其他原因?

Calendar c = Calendar.getInstance();
c.set(1900,0,1,0,0,0);  // Calendar's month is 0 based
c.set(Calendar.MILLISECOND, 0);
System.out.println(c.getTimeInMillis() / 1000);
DateTime dt = new DateTime(1900,1,1,0,0,0);   // joda's month is 1 based
System.out.println(dt.getMillis() / 1000);

这是输出

-2209017600
-2209017943

【问题讨论】:

  • 介意展示你具体得到的结果吗?
  • @Ambrish:不——Joda 时间的月份是从 1 开始的,而不是从 0 开始的。
  • 请注意,到目前为止您提供的代码甚至无法编译为 Java。如果您提供一个简短但完整的示例(包括结果),如 Java,将会有所帮助。
  • 我得到了正确的结果:Calendar c = Calendar.getInstance(); c.set(2000, 0, 1, 0, 0, 0); c.set(Calendar.MILLISECOND, 0); System.out.println(c.getTimeInMillis() / 1000); DateTime dt = new DateTime(2000, 1, 1, 0, 0, 0); System.out.println(dt.getMillis() / 1000);
  • 同意@JonSkeet。我只是对你的意思做了一个最好的猜测,测试了它并得到了匹配的答案,所以很想看看你实际写了什么以及你得到的结果。

标签: java datetime jodatime


【解决方案1】:

这是别的东西:)

import org.joda.time.DateTime; 
import java.util.Calendar;

public class DateTester {

    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.set(1900,0,1,0,0,0);
        c.set(Calendar.MILLISECOND, 0);
        System.out.println(c.getTimeInMillis()/1000);
        DateTime dt = new DateTime(1900,1,1,0,0,0);
        System.out.println(dt.getMillis()/1000);
    }
}

结果:

-2208992400
-2208992400

Process finished with exit code 0

这与 UTC 和您的时区之间的偏移有关。我的时区是 1893 年

import org.joda.time.DateTime;  
import java.util.Calendar;

public class DateTester {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        int i = 1900;
        boolean found = false;
        while (!found) {
            c.set(i,0,1,0,0,0);
            c.set(Calendar.MILLISECOND, 0);
            DateTime dt = new DateTime(i,1,1,0,0,0);
            found = !(c.getTimeInMillis() == dt.getMillis());
            if (found) {
                System.out.println("year: " + i);
                System.out.println(c.getTimeInMillis());
                System.out.println(dt.getMillis());
            }
            i--;
        }
    }
}

结果:

year: 1893
-2429830800000
-2429830408000

可以在时区数据库中检查 UTC 和设置时区之间的偏移量

【讨论】:

  • 我复制并粘贴这段代码很奇怪,我在 intellij 上得到了 2 个不同的结果。我怀疑这可能是时区问题,但即使我指定相同的时区,仍然会得到 2 个不同的结果。
猜你喜欢
  • 2015-08-25
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
相关资源
最近更新 更多