所以我有一个工作日列表,我需要检查它们是否是当天。该列表在“周一/周二”和“周三 - 周五”之间变化
我当前的解决方案是字符串比较,因此它只检测当前工作日是否写入列表项。
下面是当前的解决方案(以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天的答案)。感谢您的投入!
答案 0 :(得分:2)
是的,你的想法是可行的,它不应该严重影响性能,除非你在很短的时间内多次这样做,其中很多以数十万的规模开始。请注意,我创建了$weekdays
$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 = '';
}
}
分配值时,这也是该周期的结束符号。
{{1}}
答案 1 :(得分:1)
如果您想检查天数范围是否包含当天,您可以执行以下操作。
$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";
我不确定这是否更容易或更有效,但这并不是一个糟糕的方法。
答案 2 :(得分:0)
因此,我发现,从丹麦的工作日字符串开始制作日期时间相当复杂。从英语和格式到丹麦语更容易。
所以我不得不通过缝合你们的一部分来使它变得有点不同。一起回答。
<?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; ?>
我很确定这将会有效,直到有一天我发现了一个重大缺陷。它会在那之前完成。
非常感谢任何反馈或优化。感谢所有的投入!
答案 3 :(得分:-1)
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';