Круглая отметка времени до определенного часа

У меня есть отметка времени 1512070200 что означает 30 ноября 2017 года в 19:30 по Гринвичу или 1 декабря 2017 года в 01:00:00 по Гринвичу +05:30 в IST.

Я хочу иметь возможность вычесть время, прошедшее в тот день, и вернуться к времени в 12:00:00.

Например

Если я получу метку времени 1512978955 11 декабря 2017 г. 7:55:55 GMT Я хочу, чтобы результат был 1512950400 который 11 декабря 2017 года 12:00:00 по Гринвичу.

Не существует фиксированного количества часов, которое можно вычесть из отметки времени, вместо этого оно будет переменной величиной, зависящей от времени, прошедшего для этого конкретного дня, поэтому оно может составлять 1 миллисекунду, 1 секунду, 1 минуту или 1 час с 12 часов. 00:00

2 ответа

Одним из способов будет преобразование временной метки в дату, а затем разбить ее на составные части, чтобы вы могли использовать mktime создать дату в полдень

$ts=1512070200;

$y=date('Y',$ts);
$m=date('m',$ts);
$d=date('d',$ts);

$date=date('Y-m-d H:i:s',mktime(12,0,0,$m,$d,$y));
echo date('Y-m-d H:i:s',$ts).' -> '.$date;

какие выводы

2017-11-30 19:30:00 -> 2017-11-30 12:00:00

или, если выходная дата должна быть такой, как показано, используйте

$format=DATE_COOKIE;
$ts=1512070200;

$y=date('Y',$ts);
$m=date('m',$ts);
$d=date('d',$ts);

$date=date($format,mktime(12,0,0,$m,$d,$y));
echo date($format,$ts).' -> '.$date;

#Thursday, 30-Nov-17 19:30:00 GMT -> Thursday, 30-Nov-17 12:00:00 GMT

Еще проще в использовании noon как показано @splash58

echo date( $format, strtotime( 'noon', $ts ) );

Вы можете установить noon время до объекта DateTime

$ts=1512070200;

$date = new DateTime();
$date->setTimestamp($ts);
$date->modify('noon');
echo $date->format(DATE_COOKIE); // Thu, 30 Nov 2017 12:00:00 +0000

демонстрация

Другие вопросы по тегам