Java 中日历的一个场景,其中显式设置日期会导致一些不同的结果

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

让我们看一下下面的 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
3个回答
4
投票

月份值从 0 开始。如果您指的是十一月,请使用:

cal.set(2011, 10, 11);

请参阅 日历 javadocs。


4
投票

Java 中月份的索引为零。 当您选择 11 月份时,您将其设置为 12 月 11 日。


0
投票

tl;博士

java.time.LocalDate.of( 2011 , 11 , 11 )

遗留日期时间类存在严重缺陷

遗留日期时间类的众多缺陷之一是疯狂的编号,例如 1 月至 12 月的月份为 0-11。

永远不要使用

Calendar
Date
Timestamp
SimpleDateFormat
等。这些类已被 Java 8 及更高版本中内置的现代 java.time 类取代。

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