Отримати позначку часу на сьогодні опівночі?


123

Як би я пішов про отримання часової позначки в php сьогодні о півночі. Скажіть, що в понеділок 5:00, і я хочу, щоб мітка в понеділок (сьогодні) була опівночі (12 ранку), що вже відбулося.

Дякую


Опівночі - ні ранок, ні вечір. Також технічно немає позначки часу для опівночі.
— хакре

16
@hakre Я не згоден з вами. Опівночі є ранок, і в якому б форматі не було часових позначок, значення для півночі є значенням.
— G-Nugget

1
якщо 00:00:00 вважається сьогодні чи завтра. Сьогодні півночі - позаду нас, принаймні, всі часи, технічно. Ви хочете, 23:59:59 "сьогодні", або 00:00:00 "півночі сьогодні, яка завтра", більш-менш.
— Вессайд

5
час 00:00:00 буде сьогоднішньою півночі, оскільки скільки б часу не було потрібно, щоб дістатися до 00:00:00, що вже сталося. де як 23:59:59 було б сьогодні вночі. Якщо ви говорите сьогодні. Опівночі - ранок.
— Наска

4
00:00 - опівночі на початку дня, 24:00 - півночі наприкінці дня. Для простоти більшість цифрових годин пропускають 24:00 - заявляючи, що опівночі - це початок нового дня. Тобто, 8 лютого 24:00 та 9 лютого 00:00 на практиці однаковий момент часу.
— Йоган

Відповіді:


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

Ви можете поглянути, що PHP може запропонувати: http://php.net/datetime


52
@SamHuckaby: Ще легше: $timestamp = strtotime('today');півночі. Але pssst, зазначений вище, виглядає крутіше як відповідь на питання;)
— хакре

Мені реально потрібно почати сьогодні і півночі сьогодні. Як я можу знайти початок сьогодні, я маю на увазі 00:00:00
— Happy Coder

3
@AlwinAugustin: Ви повинні врахувати, що вони формулюються. Опівночі технічно між двома днями. Таким чином, є дещо "немає сьогодні більше". Також: Середньоночі сьогодні (за визначенням) - це (прямо перед) початок сьогодні. Ви, мабуть, маєте на увазі наступну півночі після сьогоднішнього полудня .
— хакре

так, насправді, мені потрібно 00:00:00 сьогодні та 23:59:59 сьогодні
— Happy Coder

2
Пам'ятайте, що це призведе до опівночі часового поясу вашого PHP-сервера, а не UTC + 0 ! Щоб отримати UTC + 0, ви можете використовувати strtotime('today+00:00').
— травень

73

Я думаю, що ви повинні використовувати новий об'єкт 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 Object


14
Я також вважаю за краще використовувати новий об'єкт DateTime. Якщо ви поєднаєте цю відповідь з @ hakr's, ви отримаєте:, 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
— хакре

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


мітка часу? Це просто побачення.
— Вессайд

Чи є певний формат, про який вимагала ОП? Якщо так, я би радий змінити свою публікацію, щоб повернути будь-який формат, який вони хотіли б.
— SamHuckaby

абсолютно не помічений strtotime(), розум був настільки зосереджений на функції дати. Вибачення.
— Вессайд

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
— Електрична кава
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.