我试图找出一个函数,如果DateTime日期是一个月的最后一个工作日(周一至周五),该函数将返回true。到目前为止,这就是我所拥有的。有任何改进建议吗?
例如,如果我在2020年10月30日过去,它应该返回true,因为30号星期五是10月的最后一个工作日(星期一至星期五)。
例如,如果我在2020年10月31日过去,它应该返回false,因为31号是星期六(不是星期一至星期五)
function isLastWeekday($dateObject){
$last_day = new DateTime($dateObject->format( 'Y-m-t' ));
$last_day_of_month = $last_day->format( 't' );
switch( $last_day->format('N') ) {
case 6:
$last_day_of_month += -1;
break;
case 7:
$last_day_of_month += -2;
break;
}
if( $dateObject->format( 'Y-m-d' ) == $last_day->format( 'Y-m-' ).$last_day_of_month ){
return true;
}else{
return false;
}
}
谢谢, 本
答案 0 :(得分:1)
使用strtotime()
和relative date formats,它采用传入的日期(假定为DateTime对象)并将其格式化为下个月初,并由last weekday
进行修改,因此对于2020年10月,这会将2020-10-30作为最后一个工作日。然后将其与传入的原始日期的时间戳进行比较...
function isLastWeekday($dateObject){
$end = clone $dateObject;
$end->modify('first day of next month');
return strtotime( $end->format( 'Y-m-d' ).' last weekday')
== $dateObject->getTimeStamp();
}
使用月的最后一天存在一些问题,所以这就是为什么它要在一个月内移动
或者仅使用DateTime对象...
function isLastWeekday($dateObject){
$end = clone $dateObject;
$end->modify('first day of next month')->modify('last weekday');
return $end == $dateObject;
}