2008-11-04 159 views
8

程序后跟输出。有人请向我解释为什么从1970年1月1日开始的10,000,000毫秒是1969年11月31日。那么请有人解释我的假设:第一次测试应该从1970年1月1日开始产生10,000,000毫秒的时间,这是错误的。相同的结果。Java.util.Calendar - 1970年1月1日以来的毫秒数

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

Long值:千万

日历时间以毫秒:千万

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

Long值:万亿

Millis日历时间:1000000000000

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

回答

12

的日期c.setTimeInMillis(l);您打印从Calendar是您的本地时区,您可以找出自己,而纪元被定义为UTC的1970-01-01的午夜。因此,如果您居住在UTC以西的时区,那么您的日期将显示为1969-12-31,即使(在UTC中)仍然是1970-01-01。

+2

谢谢!我以为我疯了。 – 2008-11-05 00:39:48

0

如果你改变你的第一个在c.clear();

6

首先,c.get(的Calendar.MONTH)返回0为一月,1月,等等

其次,使用日期格式,以输出所选的日期。

第三,你的问题是一个很好的例子,说明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())); 
} 
+0

非常有帮助;你间接地回答了我的问题。时区事情导致我最困惑。该改进代码是不胜感激。 – 2008-11-05 00:42:44

5

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

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

如您所愿如果您在构建日历指定“GMT”时区这应该工作:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT")); 
+0

感谢您的代码示例。 – 2008-11-05 00:40:37

1

你的时区是最有可能落后于格林尼治标准时间(如GMT-5),因此从10​​,000,000ms时代是1969年12月31日在你的时区,但由于月数是基于零的java.util.Calendar,你的日历 - >文本转换是有缺陷的,你会得到1969-11-31,而不是预期的1969-12-31。

3

不幸的是,java.util.Datejava.util.Calendar设计不佳导致这种混淆。

相关问题