8

程序后跟输出。有人请向我解释为什么 1970 年 1 月 1 日的 10,000,000 毫秒是 1969 年 11 月 31 日。好吧,请有人解释我的假设有什么问题,即第一次测试应该从 1970 年 1 月 1 日产生 10,000,000 毫秒的时间。小于 10,000,000 的数字产生同样的结果。

public static void main(String[] args) {

    String x = "10000000";
    long l = new Long(x).longValue();
    System.out.println("Long value: " + l);

    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);

    x = "1000000000000";
    l = new Long(x).longValue();
    System.out.println("\nLong value: " + l);

    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);
}

长值:10000000

米利斯日历时间:10000000

YYYY-MM-DD 格式的日期:1969-11-31

长值:1000000000000

米利斯的日历时间:1000000000000

YYYY-MM-DD 格式的日期:2001-8-8

4

6 回答 6

12

您打印的日期Calendar是您所在时区的本地日期,而纪元被定义为 UTC 1970-01-01 的午夜。因此,如果您居住在 UTC 以西的时区,那么您的日期将显示为 1969-12-31,即使(在 UTC 中)它仍然是 1970-01-01。

于 2008-11-04T21:03:29.877 回答
6

首先,c.get(Calendar.MONTH)一月返回 0,二月返回 1,以此类推。

二、用于DateFormat输出日期。

第三,您的问题很好地说明了 Java 的 Date API 是多么尴尬。如果可以,请使用 Joda Time API。它会让你的生活更轻松一些。

这是您的代码的一个更好的示例,它指示时区:

public static void main(String[] args) {

    final DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);

    long l = 10000000L;
    System.out.println("Long value: " + l);
    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Date: " + dateFormat.format(c.getTime()));

    l = 1000000000000L;
    System.out.println("\nLong value: " + l);
    c.setTimeInMillis(l);
    System.out.println("Date: " + dateFormat.format(c.getTime()));
}
于 2008-11-04T21:05:55.720 回答
5

Calendar#setTimeInMillis()将日历的时间设置为 1970 年 1 月 1 日GMT之后的毫秒数。

Calendar#get()返回为日历的时区调整的请求字段,默认情况下,它是您机器的本地时区

如果您在构建日历时指定“GMT”时区,这应该可以正常工作:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
于 2008-11-04T21:18:48.427 回答
3

可悲的是,java.util.Date设计java.util.Calendar不当导致了这种混乱。

于 2008-11-05T00:25:11.217 回答
1

您的时区很可能落后于 GMT(例如 GMT-5),因此从 1969 年 12 月 31 日开始的 10,000,000 毫秒在您的时区,但是由于月份是从零开始的,因此java.util.Calendar您的Calendar-to-text 转换存在缺陷并且您得到 1969- 11-31 而不是预期的 1969-12-31。

于 2008-11-05T00:16:56.677 回答
0

c.setTimeInMillis(l);如果你改变你的第一个,你可以弄清楚自己c.clear();

于 2008-11-04T21:02:07.257 回答