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


124

Как мне получить отметку времени на php на сегодня в полночь. Скажем, сегодня понедельник 17:00, и мне нужна метка времени понедельника (сегодня) в полночь (12 часов утра), что уже произошло.

Спасибо


Полночь - это не утро и не вечер. Также технически не существует метки времени для полуночи.
hakre

16
@hakre Я с тобой не согласен. Полночь - это утро, и в каком бы формате ни была метка времени, для полуночи есть значение.
G-Nugget,

1
если 00:00:00 считается сегодня или завтра. Сегодня полночь осталась позади нас - почти всегда - технически. Вы хотите 23:59:59 «сегодня вечером» или 00:00:00 «сегодняшняя полночь, то есть завтра», более или менее.
wesside

5
время 00:00:00 будет сегодняшней полуночью, поскольку сколько времени потребуется, чтобы добраться до 00:00:00, которое уже произошло. где, как 23:59:59, будет сегодня вечером. Если вы говорите с точки зрения сегодняшнего дня. Полночь AM.
Наска

4
00:00 - это полночь в начале дня, 24:00 - это полночь в конце дня. Однако для простоты большинство цифровых часов пропускают 24:00, объявляя полночь началом нового дня. Т.е. 8 февраля 24:00 и 9 февраля 00:00 на практике являются одним и тем же моментом времени.
Johan

Ответы:


239
$timestamp = strtotime('today midnight');

Вы можете посмотреть, что может предложить PHP: http://php.net/datetime


52
@SamHuckaby: Это еще проще: $timestamp = strtotime('today');полночь. Но, пссст, тот, что выше, выглядит круче в качестве ответа на вопрос;)
hakre

Мне действительно нужно начать сегодня и в полночь сегодня. Как мне найти начало сегодняшнего дня, я имею в виду 00:00:00
Happy Coder

3
@AlwinAugustin: Вам следует подумать о том, чтобы изменить вашу формулировку. Полночь технически находится между двумя днями. Так что «сегодня больше нет». Также: Midgnight сегодня (по определению) - это (прямо перед) начало сегодняшнего дня. Вы, вероятно, имеете в виду следующую полночь после сегодняшнего полудня .
hakre

да, на самом деле мне нужно 00:00:00 сегодня и 23:59:59 сегодня
Happy Coder

2
Имейте в виду, что это приведет к полуночи часового пояса вашего PHP-сервера, а не UTC + 0 ! Чтобы получить UTC + 0, вы можете использовать strtotime('today+00:00').
mae

74

Я думаю, что вам следует использовать новый объект PHP DateTime, поскольку у него нет проблем с датами за пределами 32-битных ограничений, которые есть у strtotime (). Вот пример того, как получить сегодняшнюю дату в полночь.

$today = new DateTime();
$today->setTime(0,0);

Или, если вы используете PHP 5.4 или новее, вы можете сделать это следующим образом:

$today = (new DateTime())->setTime(0,0);

Затем вы можете использовать, echo $today->format('Y-m-d');чтобы получить формат, в котором вы хотите выводить ваш объект.

Объект PHP DateTime


14
Я также предпочитаю использовать новый объект DateTime. Если вы объедините этот ответ с @ hakr, вы получите:, new DateTime('today midnight')что проясняет намерение (но это, конечно, дело вкуса).
Martijn

1
Я выполняю работу ORM SQL, и мне пришлось использовать объект DateTime для сравнения. Это именно то, что я искал. +1
NobleUplift

Может быть$today = new DateTime('today')
ProgZi

Также полезно, если вы используете Carbon, который наследуется от DateTime. Таким образом, вы также можете делать, new Carbon('today midnight')а затем использовать все углеродные вещи, например ->subDays(6). См. Carbon.nesbot.com
Кристофер К.

Относительно 32-битного ограничения: в PHP-документе для strtotime говорится : «Для 64-битных версий PHP допустимый диапазон временной метки фактически бесконечен, поскольку 64-битные могут представлять приблизительно 293 миллиарда лет в любом направлении». Так что это применимо только к 32-битному php.
Кристофер К.


7

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

Ужасно, правда? На самом деле это обычная проблема, но полный ответ зависит от местоположения:

$zone = new \DateTimeZone('America/New_York'); // Or your own definition of “here”
$todayStart = new \DateTime('today midnight', $zone);
$timestamp = $todayStart->getTimestamp();

Возможные определения слова «здесь» перечислены на странице https://secure.php.net/manual/en/timezones.php.


Нравится strtotime('America/New_York today midnight');? - 3v4l.org/I85qD
hakre

5
$today_at_midnight = strtotime(date("Ymd"));

должен дать вам то, что вам нужно.

объяснение

Я использовал функцию даты PHP, чтобы получить сегодняшнюю дату без каких-либо ссылок на время, а затем передать ее функции «строка во время», которая преобразует дату и время в временную метку эпохи. Если он не успевает, он принимает первую секунду этого дня.

Ссылки: Функция даты: http://php.net/manual/en/function.date.php

Строка ко времени: http://us2.php.net/manual/en/function.strtotime.php


Отметка времени? Это просто свидание.
wesside

Есть ли конкретный формат, о котором просил OP? Если так, я был бы рад изменить свое сообщение, чтобы вернуть любой формат, который они хотели бы.
SamHuckaby

полностью игнорируемый strtotime(), ум был так сосредоточен на функции даты. Извиняюсь.
wesside

2

Более предметным способом:

$today = new \DateTimeImmutable('today');

пример:

 echo (new \DateTimeImmutable('today'))->format('Y-m-d H:i:s');
// will output: 2019-05-16 00:00:00

и:

echo (new \DateTimeImmutable())->format('Y-m-d H:i:s');
echo (new \DateTimeImmutable('now'))->format('Y-m-d H:i:s');
// will output: 2019-05-16 14:00:35

1
$timestamp = strtotime('today midnight');

такой же как

$timestamp = strtotime('today');

и это немного меньше работы на вашем сервере.


0

$midnight = strtotime('midnight');действительно
Вы также можете попробовать strtotime('12am')или strtotime('[input any time you wish to here. e.g noon, 6pm, 3pm, 8pm, etc]'). Я пропустил добавление сегодня до полуночи, потому что по умолчанию сегодня.


0

Если вы используете Carbon, вы можете сделать следующее. Вы также можете отформатировать эту дату, чтобы установить Expireзаголовок HTTP.

Carbon::parse('tomorrow midnight')->format(Carbon::RFC7231_FORMAT)

0

Обновленный ответ от 19 апреля 2020 г.

Просто мы можем это сделать:

$today = date('Y-m-d 00:00:00');


-1

function getTodaysTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const startOfDay = currentTimeStamp - (currentTimeStamp % 86400);
  return { startOfDay, endOfDay: startOfDay + 86400 - 1 };
}

// starts from sunday
function getThisWeeksTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const currentDay = new Date(currentTimeStamp * 1000);
  const startOfWeek = currentTimeStamp - (currentDay.getDay() * 86400) - (currentTimeStamp % 86400);
  return { startOfWeek, endOfWeek: startOfWeek + 7 * 86400 - 1 };
}


function getThisMonthsTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const currentDay = new Date(currentTimeStamp * 1000);
  const startOfMonth = currentTimeStamp - ((currentDay.getDate() - 1) * 86400) - (currentTimeStamp % 86400);
  const currentMonth = currentDay.getMonth() + 1;
  let daysInMonth = 0;
  if (currentMonth === 2) daysInMonth = 28;
  else if ([1, 3, 5, 7, 8, 10, 12].includes(currentMonth)) daysInMonth = 31;
  else daysInMonth = 30;
  return { startOfMonth, endOfMonth: startOfMonth + daysInMonth * 86400 - 1 };
}


console.log(getTodaysTimeStamp());
console.log(getThisWeeksTimeStamp());
console.log(getThisMonthsTimeStamp());


Вопрос касается PHP. Этот ответ написан на JavaScript
Electric Coffee
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.