【问题标题】:How does Gregorian WEEK_OF_YEAR works [duplicate]Gregorian WEEK_OF_YEAR 如何工作[重复]
【发布时间】:2021-05-12 20:59:58
【问题描述】:

为什么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

【问题讨论】:

    标签: java date gregorian-calendar


    【解决方案1】:

    tl;博士

    LocalDate.now().get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )
    

    February 9, 2021 is in week # 6 属于 2021 年的 ISO 8601 week-based year,从 2021 年 1 月 4 日星期一到 2022 年 1 月 2 日星期日(含)。

    在标准表示法中,2021 年 2 月 9 日是 2021 年第六周的第二天星期二:
    2021-W06-2

    详情

    可怕的类 GregorianCalendar 在几年前被 JSR 310 中定义的现代 java.time 类所取代。

    java.time

    获取当前日期。

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

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

    • 每周从周一到周日,并且
    • 第 1 周包含日历年的第一个星期四。

    根据该定义,每个以周为单位的年有 52 或 整整 53 周。

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

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

    int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );
    

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

    请参阅基于 ISO 8601 的 2021 年的 this list of weeks

    【讨论】:

    • 谢谢,Basil,我还有一个疑问,为什么当周是 6 时会打印 7
    • @saurabhkumar 根据 ISO 8601 的定义,这是第 7 周。2021 年第 1 周开始于 2020 年 12 月 28 日。有几种定义周。你忽略了指定你的。
    • calendar.get(Calendar.WEEK_OF_YEAR) 这打印 7
    • @saurabhkumar 是的,正确,现在已在评论中修复。谢谢!我添加到答案。我必须在喝完咖啡之前停止发帖。
    • @saurabhkumar 是的,同一个网站显示53 weeks in ISO 8601 week-based year 2020
    【解决方案2】:

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

    您的意思可能是 calendar.get(Calendar.WEEK_OF_YEAR)(今天 2 月 9 日,它将打印 7,而不是 6,因为它是从 1 开始,而不是从 0 开始)。

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

    【讨论】:

    【解决方案3】:

    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 周。

    【讨论】:

    • 那么,2020 年有 53 周,对吧?
    • 我的输出与你的不同 当前周:7 当前周:7
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2014-02-18
    • 2014-04-17
    相关资源
    最近更新 更多