不败君

前端萌新&初级后端攻城狮

PHP判断某个日期是否为工作日

PHP判断某个日期是否为工作日

2020-10-28 12:03:07

围观(4308)

PHP 判断日期是否为周六日很简单,如获取今天是周几:

date('w');

如果返回了 0 或者 6 就是周日和周六,获取指定日期是周几可以这样:

date('w', '20201028');

当然本文没那么简单,因为本文要获取的是“工作日”而不是周六日。

因为每年都有一些传统节日,而且这些传统节日每年的日期都不一样,国家给的节假日安排也不一样。

所以先要获取国家安排的节假日(可以直接百度搜:2020节假日安排): http://www.gov.cn/zhengce/content/2019-11/21/content_5454164.htm


接着就是将这些日期进行排列并进行判断,例如博主写的这样的方法:

/*
返回 false 非工作日 true 工作日
@param string $target_day
@return bool
**/
function getIsWorkingDay(string $target_day) : bool
{
	if (!strtotime($target_day) || mb_strlen($target_day) !== 8) {
		return false;
	}

	// 特殊的假日 (传统节日放假)
	$lst_holiday = [
		'20200101' => '',			// 元旦
		'20200124' => '20200202',	// 春节
		'20200404' => '20200406',	// 清明节
		'20200501' => '20200505',	// 劳动节
		'20200625' => '20200627',	// 端午节
		'20201001' => '20201008',	// 中秋
		'20201001' => '20201008',	// 国庆	(由于 2020 年中秋和国庆同样 所以国庆的可以省略)
	];


	// 特殊的工作日 (传统节日前后补班)
	$lst_working_day = [
		'20200119' => '',	// 春节
		'20200426' => '',	// 劳动节
		'20200509' => '',	// 劳动节
		'20200628' => '',	// 端午节
		'20200927' => '',	// 中秋 / 国庆
		'20201010' => '',	// 中秋 / 国庆
	];


	// 遍历数组 获取今天是否为假日
	foreach ($lst_holiday as $holiday_key => $holiday_value) {
		if ($holiday_key == $target_day) {
			return false;
		}

		if ($holiday_key > $target_day) {
			if (!empty($holiday_value) && $holiday_value <= $target_day) {
				return false;
			}
		}
	}

	// 遍历数组 获取今天是否为工作日
	foreach ($lst_working_day as $working_key => $working_value) {
		if ($working_key == $target_day) {
			return true;
		}

		if ($working_key > $target_day) {
			if (!empty($working_value) && $working_value <= $target_day) {
				// var_dump(2);
				return true;
			}
		}
	}

	// 最后执行到这里 说明当前日期并非特殊节假日或需要补班的时间
	$week = date('w', strtotime($target_day));

	if (!$week || $week == 6) {
		// var_dump(3);
		return false;
	}

	// var_dump(4);
	return true;
}

// 假设时间输入不对
var_dump(getIsWorkingDay('bubaijun_com'));	// 返回 false

var_dump(getIsWorkingDay(date('Ymd')));		// 返回 true 是工作日

var_dump(getIsWorkingDay('20201031'));		// 返回 false 非工作日

var_dump(getIsWorkingDay('20200101'));		// 返回 false 特殊节假日

var_dump(getIsWorkingDay('20201001'));		// 返回 false 特殊节假日

var_dump(getIsWorkingDay('20201010'));		// 返回 true 国庆中秋补班

var_dump(getIsWorkingDay('20200927'));		// 返回 true 国庆中秋补班

复制上面的代码就能实现判断某个指定日期是否为工作日了。

缺点就是每年知道节假日安排之后都要进行数据修改。

本文地址 : bubaijun.com/page.php?id=218

版权声明 : 未经允许禁止转载!

评论:我要评论

ss 沙发

循环判断写反了吧

评论时间:2021-08-18 09:40:52

回复

不败君 板凳

@ss 应该没有吧... 😥 可以说一下哪行代码的判断吗?

评论时间:2021-08-18 10:43:16

回复

发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语