java - 无论使用什么日期格式,都需要在一个月内获得正确的输出周数
问题描述
我有这个代码可以正确返回周数。
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) 选择更改日期、时间或数字格式链接。你会得到下面的弹出窗口,只需更改格式。
解决方案
你的结果应该是这样的。既然你期望别的东西,你的期望一定是错误的。
- 在美国,一周从星期日开始。每月的第 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 获得您想要的结果,但即使我在评论中询问,您还没有告诉我们您认为一个月中正确的周数,所以我可以不。
推荐阅读
- ios - 如何使用 Open ID appAuth 实现证书锁定?
- google-apps-script - 谷歌应用脚本:删除和恢复保护
- apache-kafka - 有没有办法将时间戳添加到 KSQL 流选择?
- apache-spark - 带有 Hive 元存储 3.1.0 的 Apache Spark 2.3.1
- java - 如何从后端获取文件(例如图像)并在前端显示
- javascript - 如何将对象数组传递给材质vue自动完成
- python - 如何通过python在xml文件中获取没有标签的文本
- react-native - React Native Firebase - 如何从 Firebase 存储中检索图像并在图像组件中显示?
- libgdx - 使用 gdx 功能对 libgdx 进行单元测试
- ssis - SSIS-IR “没有活动的工作人员代理。”