程序后跟输出。有人请向我解释为什么从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
答案 0 :(得分:12)
您从Calendar
打印的日期是您所在时区的当地日期,而时期定义为1970-01-01格林威治标准时间午夜。因此,如果您居住在UTC西部的时区,那么您的日期将显示为1969-12-31,即使(在UTC中)它仍然是1970-01-01。
答案 1 :(得分:6)
首先,c.get(Calendar.MONTH)为Jan返回0,为2月返回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()));
}
答案 2 :(得分:5)
Calendar#setTimeInMillis()将日历的时间设置为1970年1月1日 GMT 之后的毫秒数。
Calendar#get()会返回针对日历时区调整的请求字段,默认情况下,是您计算机的本地时区。
如果您在构建日历时指定“GMT”时区,这应该可以正常工作:
Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
答案 3 :(得分:3)
可悲的是,java.util.Date
和java.util.Calendar
的设计很差,导致了这种混乱。
答案 4 :(得分:1)
您的时区很可能落后于GMT(例如,GMT-5),因此您的时区中的10,000,000毫秒是1969年12月31日,但是因为几个月在java.util.Calendar中基于零,您的日历 - >文本转换是有缺陷的,你得到1969-11-31而不是预期的1969-12-31。
答案 5 :(得分:0)
如果您更改了c.setTimeInMillis(l);
c.clear();
,您可以弄清楚自己