我有这样的代码:
Log.d(TAG, "day=%d, month=%d, year=%s", day, month, year);
Calendar c = Calendar.getInstance();
c.clear();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
Log.i(TAG, "Date is parsed to %tF", c.getTime(), c.get(Calendar.DAY_OF_MONTH));
这是我执行时得到的日志:
day=11, month=11, year=1985
Date is parsed to 1985-12-10
为什么不是1985年12月11日?它在某些日期或调试模式下工作正常。但为什么它并不总是有效?
在使用日期以及通过 SimpleDateFormat 从字符串解析日期时,我也遇到类似的问题
编辑:此代码执行的其他示例:
day=1, month=0, year=2012
Date is parsed to 2012-01-01
day=25, month=11, year=2011
Date is parsed to 2011-12-25
day=4, month=10, year=1979
Date is parsed to 1979-11-03
day=3, month=11, year=1984
Date is parsed to 1984-12-02
日、月、年不能从其他线程更改。
日历中的月份是从零开始的。请参阅此处:http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
我建议您阅读以下内容:http://mindprod.com/jgloss/gregoriancalendar.html
如果可以的话,使用 joda-time 实际上更容易且更不容易出现错误 - 它有一个更简洁、更安全的 API。
月份是 0-11,日期从 1 开始。
月
http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
日
http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#DAY_OF_MONTH
编辑:
Calendar c = Calendar.getInstance();
c.clear();
c.set(Calendar.YEAR, 1985);
c.set(Calendar.MONTH, 11);
c.set(Calendar.DAY_OF_MONTH, 11);
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
String strdate = sdf.format(c.getTime());
System.out.println(strdate);
输出:
12/11/1985
试试这个:
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
SimpleDateFormat simpleDateFormat =
new SimpleDateFormat("MM-dd-yyyy");
Log.v("the date is:", simepleDateFormat.format(c.getTime());
感谢您的帮助。这似乎是某些 Android 设备的问题。它出现在 5 台设备中的 3 台中。我已经通过指定时间修复了它。
c.set(Calendar.HOUR_OF_DAY, 12);
c.set(Calendar.MINUTE, 30);
##更新:**这个老问题现在有了新的解决方案。
您正在使用有严重缺陷的日期时间类,这些类现在已成为遗留问题。这些类几年前就被 JSR 310 中定义的现代 java.time 类取代。
遗留类没有任何类来表示没有时间的日期。
java.util.Date
类被错误命名,因为它实际上代表了一个时刻,时间轴上的一个点。 java.sql.Date
类假装代表仅日期,但实际上是从 java.util.Date
扩展而来,这是一个糟糕的设计决策。
LocalDate
java.time.LocalDate
类表示仅日期值。
与极其混乱的
Date
和 Calendar
类不同,java.time 类使用合理的编号。因此,1 月至 12 月的月份为 1-12。正如您所料,11 月是 11 日。
LocalDate ld = LocalDate.of ( 1985 , 11 , 23 ) ; // November 23, 1985.
Month
枚举。
LocalDate ld = LocalDate.of ( 1985 , Month.NOVEMBER , 23 ) ; // November 23, 1985.