检查工作日是否在字符串中的工作日之间

Check if weekday is between weekdays in string

所以我有一个工作日列表,我需要在其中检查它们是否是当天。该列表在 'Monday/Tuesday' 和 'Wednesday - Friday'

之间变化

我目前的解决方案是字符串比较,所以它只检测当前工作日是否写在列表项中。

这是当前的解决方案(在 PHP 顺便说一句):

setlocale(LC_ALL, "danish");
$day = get_sub_field('dag'); // the field containing the user input day
$currentDay = strftime('%a', mktime());
$currentDayLower = strtolower($currentDay);
$dayLowercase = strtolower($day);

$class = '';

if(strpos($dayLowercase, $currentDayLower) !== false ){
    $class = ' current-day';
} else{
    $class = '';
}

我正在考虑拥有所有工作日的数组并将用户字段与数组中的当前日期位置进行比较,但我不确定这是否有效甚至可能。

有没有比我目前正在做的更容易的明显或替代方法?

非常感谢任何意见。

编辑:

我找到了一个可行的解决方案,并将其作为答案发布(尽管我有 2 天无法选择它作为答案)。感谢您的投入!

setlocale(LC_ALL, "danish");
$day = get_sub_field('dag'); // the field containing the user input day

$currentDayLower = strtolower(date("D"));
$dayLowercase = strtolower($day);

$class = '';

if($dayLowercase === $currentDayLower)
   $class = ' current-day';

是的,你的想法是可行的,它应该不会严重影响性能,除非你在短时间内多次这样做,其中 many 从数百个规模开始数千。请注意,我创建了一个 $weekdaysarray 并注意当您为 $class 赋值时,这也是循环的结束标志。

setlocale(LC_ALL, "danish");
$day = get_sub_field('dag'); // the field containing the user input day
$dayLowercase = strtolower($day);
$weekdays = array("monday", "tuesday", "wednesday", "thursday", "friday");

$class = '';

for ($index = 0, (!$class) && ($index < 5); $index++) {
    if(strpos($dayLowercase, $weekdays[$index]) !== false ){
        $class = ' current-day';
    } else{
        $class = '';
    }
}

如果要检查日期范围是否包含当天,可以执行以下操作。

$period = 'Wednesday-Friday';
$limitDays = explode('-', $period);
$startDayName = trim(strtolower($limitDays[0]));
$endDayName = trim(strtolower($limitDays[1]));

$today = new DateTime();
$todayName = strtolower($today->format('l'));

// Check if the startDay or endDay is today.
echo "$startDayName $endDayName $todayName\n";
if ($startDayName === $todayName || $endDayName === $todayName) {
    echo "Same day\n";
    $class = 'current-day';
} else {
    // Get a date time representing the start day.
    $startDay = new \DateTime();
    $startDay->modify("next $startDayName");

    // Based on the start day, get the next current day.
    $thisDay = new \DateTime();
    $thisDay->modify("next $startDayName");
    $thisDay->modify("next $todayName");

    // Based on the start day, get the next end day.
    $endDay = new \DateTime();
    $endDay->modify("next $startDayName");
    $endDay->modify("next $endDayName");

    // Check if thisDay is between the startDay and endDay.
    if ($startDay < $thisDay && $thisDay < $endDay) {
        $class = 'current-day';
    } else {
        $class = '';
    }
}
echo $class . "\n";

我不确定这是否更容易或更有效,但这不是一个坏方法。

据我所知,从丹麦语工作日字符串创建日期时间相当复杂。从英语和格式到丹麦语要容易得多。

所以我不得不通过将你们的部分答案拼接在一起来让它变得有点不同。

<?php while ( have_rows('aabningstider_repeater', 'option') ) : the_row();
// vars
$day = get_sub_field('dag');
$timer = get_sub_field('aabne_timer');

$dayLower = strtolower($day);

$weekArray = array('mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag', 'søndag' );
$dayArray = preg_split('/[\s,-]+/', $dayLower);

$today = date('w') - 1;

$class = '';

if(is_array($dayArray)){

    $days = [];
    foreach ($dayArray as $daySingle ) {
        array_push($days, array_search($daySingle, $weekArray));
    }

    if($today > $days[0] && $today < $days[1]){     
        $class = ' current-day in-between-days';

    } elseif($today == $days[0] || $today == $days[1]){
        $class = ' current-day';

    } else{
        $class = '';
    }
} 

endwhile; ?>

我很确定这会一直有效,直到有一天我发现一个重大缺陷。到那时它就可以了。

非常感谢任何反馈或优化。感谢所有的投入!