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


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.