构造日期时出错

问题描述 投票:0回答:5

我有这样的代码:

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

日、月、年不能从其他线程更改。

java android date calendar
5个回答
1
投票

日历中的月份是从零开始的。请参阅此处:http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH

我建议您阅读以下内容:http://mindprod.com/jgloss/gregoriancalendar.html

如果可以的话,使用 joda-time 实际上更容易且更不容易出现错误 - 它有一个更简洁、更安全的 API。


1
投票

月份是 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

0
投票

试试这个:

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

0
投票

感谢您的帮助。这似乎是某些 Android 设备的问题。它出现在 5 台设备中的 3 台中。我已经通过指定时间修复了它。

c.set(Calendar.HOUR_OF_DAY, 12);
c.set(Calendar.MINUTE, 30);

0
投票

##更新:**这个老问题现在有了新的解决方案。

过时的课程

您正在使用有严重缺陷的日期时间类,这些类现在已成为遗留问题。这些类几年前就被 JSR 310 中定义的现代 java.time 类取代。

遗留类没有任何类来表示没有时间的日期。

java.util.Date
类被错误命名,因为它实际上代表了一个时刻,时间轴上的一个点。
java.sql.Date
类假装代表仅日期,但实际上是从
java.util.Date
扩展而来,这是一个糟糕的设计决策。

LocalDate

在现代 Java 中,通过

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.
© www.soinside.com 2019 - 2024. All rights reserved.