2012-01-24 2 views
-1
<?php 

$one = new DateTime('2012-01-24 13:00'); 
$two = new DateTime('2012-01-24 06:00'); 
$three = new DateTime('2012-01-24 08:42'); 
$four = new DateTime('2012-01-24 12:00'); 
$five = new DateTime('2012-01-24 06:33'); 

$array = array($one, $two, $three, $four, $five); 

foreach($array as $a){ 
    $a->modify("-7 hours"); 

    echo $a->format('Y-m-d H:i') . "\n"; 
} 

эфир:http://codepad.org/JgoX3y7OМинус часов и часы диапазона минус в DateTime с PHP

Я хотел бы показать даты без часов между 23: 00-05: 00. Если дата находится в этом диапазоне, то она должна делать минус без этих часов. Мой пример показать:

2012-01-24 06:00 
2012-01-23 23:00 
2012-01-24 01:42 
2012-01-24 05:00 
2012-01-23 23:33 

, но должно быть:

2012-01-24 06:00 
2012-01-23 17:00 
2012-01-24 19:42 
2012-01-24 05:00 
2012-01-23 17:33 

$ один и $ четыре в порядке, потому что 12: 00-7: 00 и 13: 00-7: 00 не находятся в диапазоне 23: 00-05: 00

Как я могу это сделать?

+0

Я не» Не понимаю ваш вопрос. Что именно должно произойти с датами, когда время между 23:00 и 5:00? –

+0

, если время между 23: 00-05: 00, а затем минус без этого диапазона. –

+0

Я также не понимаю, чего вы пытаетесь достичь. Код делает именно то, что вы ожидаете, он вычитает 7 часов из всех заданных объектов DateTime. – Oldskool

ответ

3

Согласно вашим комментариям, я могу только догадываться, что вы являетесь tyring, чтобы «пропустить» определенный период времени. Затем вы должны быть добавление «штраф» за то количество времени, как:

foreach($array as $a){ 
    $a->modify("-7 hours"); 

    // Is the time within the 'skip period'? 
    if($a->format('H') >= 23 || $a->format('H') < 5) { 
     // The calculation got a time between 23:00 - 05:00, add time penalty! 
     $a->modify("-6 hours"); 
    } 

    echo $a->format('Y-m-d H:i') . "\n"; 
} 
1

Если я прав и понимание ваш вопрос, вы ищете что-то вроде этого:

foreach($array as $date){ 
    $date->modify("-7 hours"); 

    // Adding one hour, so the range is 0-6am 
    if($date->modify("+1 hours")->format('H') < 6) { 
    //time is within that range, so substract 8 hours 
    //cause we added 1 before 
    $date->modify("-8 hours"); 
    } 

    echo $date->format('Y-m-d H:i') . "\n"; 
} 
1

В I понять вашу проблему, вы хотите вычесть 7 часов с даты/времени, если результат не будет в интервале 23: 00-05: 00, затем еще 6 часов должны быть вычтены. Я хотел бы предложить сделать что-то вроде этого:

<?php 
$array = array(
    new DateTime('2012-01-24 13:00'), 
    new DateTime('2012-01-24 06:00'), 
    new DateTime('2012-01-24 05:59'), 
    new DateTime('2012-01-24 08:42'), 
    new DateTime('2012-01-24 12:00'), 
    new DateTime('2012-01-24 11:59'), 
    new DateTime('2012-01-24 06:33') 
); 

foreach($array as $a) { 
    $a->modify("-7 hours"); 
    if(($a->format('H') + 1) < 6) { 
    $a->modify("-6 hours"); 
    } 
    echo $a->format('Y-m-d H:i') . "\n"; 
} 
?> 

Это должно выход

2012-01-24 06:00 
2012-01-23 17:00 
2012-01-23 22:59 
2012-01-23 19:42 
2012-01-24 05:00 
2012-01-24 22:59 
2012-01-23 17:33 

EDIT Вы также можете просто сделать одну гильзу в петле

foreach($array as $a) { 
    echo $a->modify((($a->format('H') + 1) < 6) ? '-13 hours' : '-7 hours')->format('Y-m-d H:i') . "\n"; 
} 
Смежные вопросы