2016-12-31 3 views
1

У меня есть активность, которая действует только в диапазоне дат независимо от месяца/года. Мне нужно проверить, соответствует ли текущая дата> = 30 и < = 05 (в следующем месяце).Как проверять день за кросс-месяц

Пример кода ниже:

$t = microtime(true); 
$micro = sprintf("%06d",($t - floor($t)) * 1000000); 
$d = new DateTime(date('Y-m-d H:i:s.'.$micro, $t)); 
$date = substr($d->format("d"),0,2); 

if($date >= 30000000 && $date <= 05000000){ 
    $validate = true; 
} 

Я просто не могу использовать> = 30 и < = 05, как это неверный диапазон. Или мне нужно будет ввести код:

if($date = 30 || $date = 31 || $date = 01 || $date = 02 || $date = 03 || $date = 04 || $date = 05){ 
    $validate = true; 
} 
+0

Вы должны использовать ' 'j'' формат спецификатора вместо '' d'':' $ day = $ d-> format ('j'); '. Нет необходимости в строковых манипуляциях. –

+0

Вам не нужно «microtime» для создания объекта DateTime для текущей даты/времени. Просто вызовите конструктор без аргументов: '$ d = new DateTime();' –

ответ

1

Да, я думаю, что ваш код в порядке. Вы могли бы сделать с помощью меток времени я думаю, но небольшое улучшение для вашего кода может быть:

$dates = array(30, 31, 1, 2, 3, 4, 5); 
if (in_array(((int)$date), $dates) 
    $validate = true; 
1

The Текущий Дата

У меня есть деятельность, которая проводится только в диапазоне дат независимо месяц /год. Мне нужно проверить, соответствует ли текущая дата> = 30 и < = 05 (в следующем месяце).

текущий дата не может быть в следующем месяце по определению. Так что если вы хотите, чтобы проверить, если текущая дата находится между 1 ст и 5-го или больше, чем 30-го , вы можете просто принести на следующий день с $day = $datetime->format('j') и проверить, если $day <= 5 или $day >= 30.

Чтобы построить объект DateTime с текущей датой , просто вызовите конструктор без аргументов. Пример:

function validate($format = 'now') { 
    $now = new DateTime($format); 
    $day = $now->format('j'); 
    return ($day >= 30 || $day <= 5); 
} 

Тестирование

// Create DateTime object for the first day of the current month 
$d = new DateTime('first day of'); 
$day_to = (new DateTime())->format('j'); 

for ($i = 0; $i < $day_to; $i++) { 
    printf("%d: %d\n", $i + 1, validate('@' . $d->getTimestamp() . " + $i days")); 
} 

Выход

1: 1 
2: 1 
3: 1 
4: 1 
5: 1 
6: 0 
7: 0 
... 
27: 0 
28: 0 
29: 0 
30: 1 
31: 1 

Произвольное Дата

Если вы хотите проверить, если дата попадает в диапазон дат, используйте сравнение ope на объектах DateTime.

В вашем конкретном случае, вы можете построить два DateTime объекты для диапазона и сравнить их с любого DateTime объекта, как показано в следующем примере:

$d = new DateTime('2017-02-01 20:15'); 

// 5th day of the next month 
$rhd = new DateTime('first day of next month'); 
$rhd->modify('+4 day'); 
$rhd->setTime(0, 0, 0); 

// 30th day of the current month 
$lhd = new DateTime('first day of'); 
$lhd->modify('+29 day'); 
$lhd->setTime(0, 0, 0); 

printf(
    "%s %s between\n%s and\n%s\n", 
    $d->format('r'), 
    ($d >= $lhd && $d <= $rhd) ? 'is' : 'is not', 
    $lhd->format('r'), 
    $rhd->format('r') 
); 
+0

, если текущая дата равна 6, оно вернет true, не так ли? –

+0

@ 4LeaveCover, почему, нет, он вернет _false_, потому что '6 <30' и' 6> 5'. Вы можете протестировать его различными аргументами, например.'new DateTime (« now + 6 days »)' –

+0

Я не уверен, потому что диапазон, который я хочу (текущий месяц) 30,31,1,2,3,4,5 (в следующем месяце), не (текущий месяц) 1,2,3,4,5,30,31 (текущий месяц). Но спасибо за ваши усилия. –

Смежные вопросы