首页 > 解决方案 > 无论使用什么日期格式,都需要在一个月内获得正确的输出周数

问题描述

我有这个代码可以正确返回周数。

package org.test.Calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class GetDaysInMonth {
    public static void main(String[] args) {
        Calendar calendar = GregorianCalendar.getInstance();
        int year = 2020;
        int month = Calendar.MAY;
        int date = 1;
        calendar.set(year, month, date);
        int numOfDaysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        int numOfWeeksInMonth = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);

        System.out.println("Number of Days In Month: " + numOfDaysInMonth);
        System.out.println("Number of Weeks In Month: " + numOfWeeksInMonth);
    }    
}

输出 :

月天数:31

月周数:6

我的日期格式是:

在此处输入图像描述

现在,当我将日期格式更改为:

在此处输入图像描述

输出不一样。

输出 :

月天数:31

月周数:4

需要输入,例如无论我们使用什么日期格式,我如何才能获得正确的输出

回答我如何更新格式的问题:a) 转到控制面板-> 时钟和区域 在此处输入图像描述

b) 选择更改日期、时间或数字格式链接。你会得到下面的弹出窗口,只需更改格式。

在此处输入图像描述

标签: javajava-8calendarjava-timegregorian-calendar

解决方案


你的结果应该是这样的。既然你期望别的东西,你的期望一定是错误的。

  • 在美国,一周从星期日开始。每月的第 1 周是包含该月第一天的那一周。因此,5 月 1 日星期五和 5 月 2 日星期六组成第 1 周。第 2 周从 5 月 3 日星期日开始。第 3 周在 5 月 10 日,第 4 周在 5 月 17 日,第 5 周在 5 月 24 日,第 6 周仅包括 5 月 31 日。
  • 英国遵循国际标准,每周从星期一开始,每月的第一周是该月至少包含 4 天的第一周。所以第 1 周是从 5 月 4 日星期一到 5 月 10 日星期日。第 2 周从 5 月 11 日开始,第 3 周从 5 月 18 日开始。第 4 周是 5 月 25 日到 31 日,因此是该月的最后一周。

在您的代码中,您没有查询该月的周数。您查询了当月的最高周数。美国有 6 个,英国有 4 个。即使两个地方的月份长度相同。

java.time

在我的演示中,我使用了现代 Java 日期和时间 API java.time,并建议您在日期工作中也这样做。现代类比过时的类好得多Calendar,坦率地说,它总是设计得很差。

    YearMonth mayThisYear = YearMonth.of(2020, Month.MAY);
    LocalDate firstOfMonth = mayThisYear.atDay(1);
    LocalDate lastOfMonth = mayThisYear.atEndOfMonth();

    // US weeks
    WeekFields us = WeekFields.of(Locale.US);
    int weekOfFirstDay = firstOfMonth.get(us.weekOfMonth());
    int weekOfLastDay = lastOfMonth.get(us.weekOfMonth());
    System.out.println("US week numbers are " + weekOfFirstDay + " - " + weekOfLastDay);

输出:

美国周数为 1 - 6

让我们尝试简称为大不列颠及北爱尔兰联合王国:

    // UK weeks
    WeekFields uk = WeekFields.of(Locale.UK);
    int weekOfFirstDay = firstOfMonth.get(uk.weekOfMonth());
    int weekOfLastDay = lastOfMonth.get(uk.weekOfMonth());
    System.out.println("UK week numbers are " + weekOfFirstDay + " - " + weekOfLastDay);

英国周数为 0 - 4

我应该很乐意向您展示如何使用 java.time 获得您想要的结果,但即使我在评论中询问,您还没有告诉我们您认为一个月中正确的周数,所以我可以不。


推荐阅读