公历 WEEK_OF_YEAR 如何运作

问题描述

为什么 calendar.WEEK_OF_YEAR 打印 3 而不是 6。

GregorianCalendar calendar = new GregorianCalendar();
System.out.println("time"+calendar.getTime());
System.out.println("week of year "+calendar.WEEK_OF_YEAR);

输出

time Tue Feb 09 12:58:02 IST 2021
week of year 3

解决方法

tl;博士

git diff-index
2021 年 February 9,2021 is in week # 6

ISO 8601 week-based year,从 2021 年 1 月 4 日星期一到 2022 年 1 月 2 日星期日(含)运行。

在标准表示法中,2021 年 2 月 9 日是 2021 年以周为基础的年份的第六周的第二个星期二:
LocalDate.now().get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )

详情

可怕的类 2021-W06-2 多年前被 JSR 310 中定义的现代 java.time 类所取代。

java.time

获取当前日期。

GregorianCalendar

使用 definition of ISO 8601 获取基于周的一年中的一周。在这个定义中:

  • 每周一至周日,以及
  • 第 1 周包含日历年的第一个星期四。

根据该定义,每个基于周的年份都有 52 或 整整 53 周。

LocalDate today = LocalDate.now( ZoneId.of( "Asia/Kolkata" ) ) ;

并获取该日期基于周的年份的年份编号。这可能与第一周和最后一周的日历年编号不同。

int week = today.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );

例如,2021 年 ISO 8601 基于周的年份从 2021 年 1 月 4 日开始。2021 年 2 月 9 日在第 6 周。

参见 ISO 8601 2021 年中的 this list of weeks

,

calendar.WEEK_OF_YEAR 是一个常量,你不能那样使用它。

您可能指的是 calendar.get(Calendar.WEEK_OF_YEAR)(并且,今天 2 月 9 日它将打印 7,而不是 6,因为它是基于 1,而不是基于 0)。

请注意,正如 Basil Bourque 的精彩回答所解释的那样,您应该使用新的 DateTime API。

,

java.util 的日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API

answer by Basil Bourque 很好地解释了如何使用 Java SE 8 日期时间 API。如果您仍想使用旧 API,您有几个选择:

import java.text.SimpleDateFormat;
import java.util.Calendar;

class Main {
    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();

        // Getting current week using SimpleDateFormat
        System.out.println("Current week: " + new SimpleDateFormat("w").format(calendar.getTime()));

        // Getting current week using Calendar.WEEK_OF_YEAR
        System.out.println("Current week: " + calendar.get(Calendar.WEEK_OF_YEAR));
    }
}

输出:

Current week: 6
Current week: 6

第 01 周的 ISO 8601 definition 是包含公历年(即一月)第一个 Thursday 的那一周。根据此定义,2021 年的第 1 周从 1 月 4 日开始,因此当前周是第 6 周。

enter image description here