让我们看一下下面的 Java 代码片段。
package demo;
import java.util.Calendar;
final public class Main
{
public static void main(String[] args)
{
Calendar cal = Calendar.getInstance();
cal.set(2011, 11, 11); //Setting a date to itself.
System.out.println(cal.get(Calendar.YEAR) + " "
+ cal.get(Calendar.WEEK_OF_YEAR) + "
" + cal.get(Calendar.DAY_OF_YEAR));
}
}
在上面的简单代码中,我暂时(并且明确)使用方法
cal.set(2011, 11, 11);
将当前日期设置为自身,即2011年11月11日。因此,我得到输出 2011 51 345、当前年份 2011、一年中的星期 51 和一年中的某一天 345。
当我在
cal.set(2011, 11, 11);
行上发表评论时,我得到的结果是,2011 46 315分别是当前年份、当前星期和当前日期,这与之前的结果不同。
[在这里,我不会设定任何日期。上述代码中的语句
cal.set(2011, 11, 11);
被注释掉,系统会自动检索当前日期,即2011-11-11]。
在这两种情况下,都使用相同的日期,即2011-11-11,但两种情况下获得的结果仍然不同。为什么?
Java 中月份的索引为零。 当您选择 11 月份时,您将其设置为 12 月 11 日。
java.time.LocalDate.of( 2011 , 11 , 11 )
遗留日期时间类的众多缺陷之一是疯狂的编号,例如 1 月至 12 月的月份为 0-11。
永远不要使用
Calendar
、Date
、Timestamp
、SimpleDateFormat
等。这些类已被 Java 8 及更高版本中内置的现代 java.time 类取代。
java.time 类使用合理的编号。所以 1 月至 12 月为 1-12。
LocalDate
LocalDate
类。
LocalDate nov11Of2011 = LocalDate.of( 2011 , 11 , 11 ) ;
Month
枚举更加清晰。
LocalDate nov11Of2011 = LocalDate.of( 2011 , Month.NOVEMBER , 11 ) ;