Java.util.Calendar – 自1970年1月1日以来的毫秒数

程序后跟输出。 有人请向我解释为什么从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

Millis的日历时间:10000000

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

长值:1000000000000

Millis的日历时间:1000000000000

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

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

首先,c.get(Calendar.MONTH)为Jan返回0,为Feb返回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())); } 

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

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

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

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

遗憾的是, java.util.Datejava.util.Calendar的设计很差,导致了这种混乱。

您的时区很可能落后于GMT(例如,GMT-5),因此您的时区中的10,000,000毫秒来自1969年12月31日,但由于java.util.Calendar中的月份为零,因此您的日历 – >文本转换存在缺陷你得到1969-11-31而不是预期的1969-12-31。

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