JAVA 获取每周第一天和最后一天,并可自定义每周起始天为周几

本文提供了一种自定义每周起始天的方法,通过Java代码实现从周一到周五作为每周的开始,并提供了获取当前周第一天和最后一天的具体实现。

如果对你有帮助记得素质三连~

转载请注明出处~

欢迎批评指点~

https://blog.youkuaiyun.com/L_Open2021/article/details/127327416

需求

之前是以周一为每周起始天,后面需求要改成以周五为每周起始天。

网上没找到好用的方案只能自己写了。

下面直接贴代码

    /**
	 * @Description: 获取当前周第一天(周一)
	 * @param date        当前时间
	 * @param modifyValue 预设值 设定周几为第一天,1-7为周一到周日
	 * @Author: wsp
	 **/
	public static Date getWeekStart(Date date, Integer modifyValue) {
		//判断为空 或者 不在[1,7]区间。。默认为1
		if (modifyValue == null || (modifyValue<1 || modifyValue > 7)) modifyValue = 1;

		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);

		//如果以周日为默认,则直接用国际日历,当前时间的第一天即可
		if (modifyValue == 7) {
			calendar.set(Calendar.DAY_OF_WEEK, 1);
			return calendar.getTime();
		}

		// 获取当前为周几(国际日历周日为1,改为周一为1)
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

		if (dayOfWeek > 1 && dayOfWeek <= 7) {
			dayOfWeek = dayOfWeek - 1;
		} else if (dayOfWeek == 1) {
			dayOfWeek = 7;
		}

		/**
		 * 如果当前日期大于等于设定日期 , 并且当前时间不是周日
		 * 		则: 直接从本周取设定日期的那一天
		 * 		否则:取上一周的设定日期的那一天
		 */
		if (dayOfWeek >= modifyValue && dayOfWeek != 7) {
			//直接从本周取设定日期的那一天
			calendar.set(Calendar.DAY_OF_WEEK, modifyValue + 1);

			return calendar.getTime();
		} else {
			//获取上一周的某个时间,当前时间-7即可,
			Calendar calendar2 = Calendar.getInstance();
			calendar2.setTime(date);
			calendar2.add(Calendar.DAY_OF_MONTH, -7);

			Date date1 = calendar2.getTime();

			Calendar calendar3 = Calendar.getInstance();
			calendar3.setTime(date1);
			//上一周的设定日期
			calendar3.set(Calendar.DAY_OF_WEEK, modifyValue + 1);

			return calendar3.getTime();
		}
	}

	/**
	 * @Description: 获取当前周最后一天(周日)
	 * @param date        当前时间
	 * @param modifyValue 浮动值,默认周一为一周开始
	 * @Author: wsp
	 **/
	public static Date getWeekEnd(Date date, Integer modifyValue) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(getWeekStart(date, modifyValue));
		calendar.add(Calendar.DAY_OF_MONTH, 6);
		return calendar.getTime();
	}
<think>我们正在处理用户关于PostgreSQL中ISO标准定义的每周第一天周几的问题。根据ISO标准,每周第一天是星期一(Monday)。在PostgreSQL中,我们可以通过函数或设置来验证这一点。但是,用户的问题直接询问ISO标准定义的每周第一天。因此,我们需要确认PostgreSQL中如何体现ISO标准。在PostgreSQL中,与周相关的函数(如EXTRACT(DOWFROM...))在ISO模式下返回的星期几编号是从星期一开始的(星期一为1,星期日为7)。这与ISO标准一致。另外,PostgreSQL的to_char函数也可以格式化日期,其中'ID'模式(ISO周编号日)返回的星期几也是从星期一到星期日(1到7)。因此,我们可以得出结论:在ISO标准下,每周第一天是星期一。但是,用户可能还想知道如何设置或查看当前数据库的周开始日。在PostgreSQL中,周开始日可以通过配置参数[lc_time]来影响,但ISO标准是固定的(星期一)。此外,PostgreSQL遵循ISO标准,因此默认情况下也是星期一。因此,我们可以这样回答:在PostgreSQL中,ISO标准定义的每周第一天是星期一。这体现在日期函数中,例如:-EXTRACT(ISODOWFROMtimestamp)函数返回的星期几编号:星期一为1,星期日为7。-to_char(timestamp,'ID')返回的ISO星期几编号也是1(星期一)到7(星期日)。注意:ISODOW是DOW的ISO版本,而普通的DOW(星期几编号)在PostgreSQL中是从星期日(0)到星期六(6)的,这是美国标准。因此,要遵循ISO标准,应使用ISODOW。下面我们给出一个示例查询:```sqlSELECTEXTRACT(ISODOWFROMDATE'2023-01-02')ASday1,--2023-01-02是星期一EXTRACT(ISODOWFROMDATE'2023-01-01')ASday7;--2023-01-01是星期日```结果将是:day1=1day7=7这证明了ISO标准下星期一为一周的第一天。另外,用户可能还想知道如何更改一周的第一天?实际上,ISO标准是固定的,不能更改。但是,如果用户想要按照其他标准(比如美国标准,周日为一周的第一天)来获取星期几编号,可以使用DOW(0-6,周日为0)。因此,总结:PostgreSQL中ISO标准定义的每周第一天是星期一。根据要求,我们需要生成相关问题。§§相关问题§§1.如何在PostgreSQL中获取当前日期所在的周数(ISO标准)?2.如何设置PostgreSQL的周开始日为星期日?3.PostgreSQL中如何格式化日期以显示星期几的名称?4.在PostgreSQL中,如何计算两个日期之间的周数(按照ISO标准)?</think>在 PostgreSQL 中,ISO 8601 标准定义的每周第一天是**星期一**(Monday)。这体现在 PostgreSQL 的日期处理函数中: 1. **`EXTRACT(ISODOW FROM ...)` 函数** 使用 ISO 标准的星期编号(ISODOW)时: - **星期一返回 `1`** - 星期日返回 `7` 示例: ```sql SELECT EXTRACT(ISODOW FROM DATE '2023-10-02') AS monday; -- 返回 1(周一) SELECT EXTRACT(ISODOW FROM DATE '2023-10-01') AS sunday; -- 返回 7(周日) ``` 2. **与普通 DOW 的区别** 非 ISO 标准的 `EXTRACT(DOW FROM ...)` 以星期日为起点(星期日=0,星期六=6): ```sql SELECT EXTRACT(DOW FROM DATE '2023-10-01') AS sunday; -- 返回 0 ``` 3. **周计算函数** ISO 周相关函数(如 `date_part('isoyear', ...)`)均以周一作为周起点: ```sql SELECT date_part('week', DATE '2023-01-01') AS iso_week; -- 2023-01-01是周日,属于2022年的最后一周 ``` ### 验证示例 ```sql -- 检查特定日期的 ISO 星期编号 SELECT date '2023-10-02' AS date, EXTRACT(ISODOW FROM date '2023-10-02') AS iso_day_of_week; ``` 结果: ``` date | iso_day_of_week -------------+----------------- 2023-10-02 | 1 -- 周一 ``` ### 说明 - ISO 8601 标准规定:**每周从星期一开始**,星期日是周末。 - PostgreSQL 严格遵循此标准,`ISODOW` ISO 周计算函数均以周一为第 1 [^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值