Минус часов и минус диапазон часов в DateTime с PHP - PullRequest
0 голосов
/ 24 января 2012
<?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";
}

LIVE: http://codepad.org/JgoX3y7O

Я бы хотел показать дату без часов между 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

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

Как мне это сделать?

Ответы [ 3 ]

3 голосов
/ 24 января 2012

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

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 голос
/ 24 января 2012

Насколько я понимаю вашу проблему, вы хотите вычесть 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";
}
1 голос
/ 24 января 2012

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

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...