有时日期对象会给我错误的一周。我的代码非常简单。
//Setting to 2017, April, 12th
Date dt = new Date(2017, 3, 11);
System.out.printf("%TA", dt);
这给了我'WEDNESDAY',这是正确的。事实上,在近期和不久的将来,它似乎在任何一年都能正常运作。
但是,如果我将时间设置为2999,8月,5日。这是
//Setting to 2999, August, 5th
Date dt = new Date(2999, 7, 4);
System.out.printf("%TA", dt);
当实际8月2999日是星期一时,它会返回'星期二'。
为什么会这样?我该如何解决这个问题?
干杯!
答案 0 :(得分:2)
为什么会这样?
您的答案的重要部分已在评论中。这种贬低的构造函数令人困惑。你设法让这个月变得正确,很多人都没有;你错了一年,而且每个月错了。由于您使用的是System.out.printf()
,因此您也可以使用它进行检查:
// Setting to 2017, April, 12th -- NOT
Date dt = new Date(2017, 3, 11);
System.out.printf("%1$tm %1$te,%1$tY%n", dt);
打印
04 11,3917
这恰好是你所预期的星期三。我怀疑这种巧合可以持续到2001年到2099年。它在2000年2月没有。当年2月12日是星期六,但是:
// Incorrect attempt at setting to 2000, February, 12th
dt = new Date(2000, 1, 11);
System.out.printf("%TA%n", dt);
打印
SUNDAY
我该如何解决这个问题?
如果您可以使用Java 8或更高版本,我建议您不要仅使用已弃用的构造函数,而应远离Date
类altoghether。这些天我们有一堆更好的选择。
// Setting to 2999, August, 5th
LocalDate ld = LocalDate.of(2999, Month.AUGUST, 5);
System.out.println(ld);
System.out.printf("%TA", ld);
打印正确的
2999-08-05
MONDAY
我通常会在新课程中使用DateTimeFormatter
,但LocalDate
也会与System.out.printf()
一起使用。根据文档,它适用于TemporalAccessor
,其中包括DayOfWeek
,Instant
,IsoEra
,LocalDate
,LocalDateTime
,LocalTime
,Month
,MonthDay
,OffsetDateTime
,OffsetTime
,Year
,YearMonth
,ZonedDateTime
,ZoneOffset
等