为什么 2010 年 12 月 31 日返回 1 作为一年中的一周?

2022-09-01 11:18:45

例如:

Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
out.println( c.get( Calendar.WEEK_OF_YEAR ) );  

打印 1

Joda时间也是如此。

:)


答案 1

一年中周的定义取决于区域设置

它在美国是如何定义的,在其他帖子中进行了讨论。例如,在德国 (DIN 1355-1 / ISO 8601):一年的第一周*是新年有 4 天或更多天的第一周。

*一周的第一天是星期一,一周的最后一天是星期日

Java关注的是语言环境。例如:Calendar

public static void main(String[] args) throws ParseException {

    DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date lastDec2010 = sdf.parse("31/12/2010");

    Calendar calUs = Calendar.getInstance(Locale.US);       
    calUs.setTime(lastDec2010);

    Calendar calDe = Calendar.getInstance(Locale.GERMAN);       
    calDe.setTime(lastDec2010);

    System.out.println( "us: " + calUs.get( Calendar.WEEK_OF_YEAR ) ); 
    System.out.println( "de: " + calDe.get( Calendar.WEEK_OF_YEAR ) );
}

指纹:

us: 1
de: 52

添加对于美国(我能想到墨西哥也是如此)1。一年中的一周是 1 的一周。一月属于。-- 所以如果 1.Januar是星期六,然后是之前的星期五(31。Dec)属于同一周,在这种情况下,这一天属于1。2011年一周。


答案 2

为WEEK_OF_YEAR字段计算的值范围为 1 到 53。一年的第 1 周是从 getFirstDayOfWeek() 开始的最早的七天时间段,其中包含该年至少 getMinimalDaysInFirstWeek() 天数。因此,它取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 和 1 月 1 日这一周中的某一天的值。一年的第 1 周到下一年的第 1 周之间的周数按顺序从 2 到 52 或 53(根据需要)编号。

要确定该周是 2010 年的最后一周还是 2011 年的第一周,Java 使用 javadoc。如果该方法返回 7,则该周中所有天数都属于同一年的第一周是第一周,如果它返回 1,则包含下一年任意天的第一周是下一年的第一周。getMinimalDaysInFirstWeek

在这种情况下,2011 年 1 月 1 日是星期六,因此只要您希望将一周和一天视为下一年的第一周,就将其视为 2011 年的第一周,否则请执行:

Calendar c = Calendar.getInstance();
c.setMinimalDaysInFirstWeek(7);//anything more than 1 will work in this year
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
System.out.println( c.get( Calendar.WEEK_OF_YEAR ) ); 

返回:

52

推荐