Ottenere un timestamp per oggi a mezzanotte?


123

Come dovrei fare per ottenere un timestamp in php per oggi a mezzanotte. Diciamo che è lunedì alle 17:00 e voglio il timestamp per lunedì (oggi) a mezzanotte (12:00) che è già accaduto.

Grazie


La mezzanotte non è né am né pm. Inoltre, tecnicamente, non esiste alcun timestamp per la mezzanotte.
— hakre

16
@hakre Non sono d'accordo con te. La mezzanotte è am e qualunque sia il formato in cui è presente un timestamp, esiste un valore per mezzanotte.
— G-Nugget

1
se 00:00:00 considerato oggi o domani. La mezzanotte di oggi è dietro di noi, quasi sempre, tecnicamente. Vuoi le 23:59:59 di "stasera" o le 00:00:00 "mezzanotte di oggi, che è domani", più o meno.
— mercoledì

5
un'ora di 00:00:00 sarebbe la mezzanotte di oggi come per quanto tempo ci vuole per arrivare alle 00:00:00 che è già successo. dove le 23:59:59 sarebbero stasera. Se parli in termini di oggi. La mezzanotte è AM.
— Nazca

4
00:00 è mezzanotte all'inizio di un giorno, 24:00 è mezzanotte alla fine di una giornata. Per semplicità, tuttavia, la maggior parte degli orologi digitali salta le 24:00, dichiarando che la mezzanotte è l'inizio di un nuovo giorno. Vale a dire l'8 febbraio 24:00 e il 9 febbraio 00:00 è in pratica lo stesso momento.
— Johan

Risposte:


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

Potresti voler dare un'occhiata a cosa ha da offrire PHP: http://php.net/datetime


52
@SamHuckaby: è ancora più facile: $timestamp = strtotime('today');è mezzanotte. Ma pssst quella sopra sembra più interessante come risposta alla domanda;)
— hakre

In realtà ho bisogno di iniziare oggi e mezzanotte di oggi. Come posso trovare l'inizio di oggi intendo per 00:00:00
— Happy Coder

3
@ AlwinAugustin: dovresti considerare di differire la tua formulazione. La mezzanotte è tecnicamente tra due giorni. Quindi c'è un po '"non più oggi". Inoltre: Midgnight di oggi (per definizione) è (subito prima) l'inizio di oggi. Probabilmente intendi la prossima mezzanotte dopo oggi mezzogiorno .
— hakre

sì, in realtà ciò di cui ho bisogno sono le 00:00:00 di oggi e le 23:59:59 di oggi
— Happy Coder

2
Tieni presente che questo produrrà la mezzanotte del fuso orario del tuo server PHP, non UTC + 0 ! Per ottenere UTC + 0 puoi usare strtotime('today+00:00').
— mae

73

Penso che dovresti usare il nuovo oggetto PHP DateTime in quanto non ha problemi a fare date oltre le restrizioni a 32 bit di strtotime (). Ecco un esempio di come potresti ottenere la data odierna a mezzanotte.

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

Oppure, se stai usando PHP 5.4 o successivo, puoi farlo in questo modo:

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

Quindi puoi usare echo $today->format('Y-m-d');per ottenere il formato in cui desideri l'output dell'oggetto.

Oggetto DateTime PHP


14
Preferisco anche usare il nuovo oggetto DateTime. Se combini questa risposta con @ hakr ottieni:, il new DateTime('today midnight')che rende l'intenzione più chiara (ma questa è ovviamente una questione di gusti).
— Martijn

1
Sto eseguendo il lavoro ORM SQL e ho dovuto utilizzare l'oggetto DateTime per i confronti. Questo e 'esattamente quello che stavo cercando. +1
— NobleUplift

Può essere$today = new DateTime('today')
— ProgZi

Utile anche se stai usando Carbon, che eredita da DateTime. Quindi, puoi anche farlo new Carbon('today midnight')e poi puoi usare tutte le cose del carbonio come ->subDays(6). Vedi carbon.nesbot.com
— Christopher K.

Per quanto riguarda la restrizione a 32 bit: Il documento PHP per strtotime afferma : "Per le versioni a 64 bit di PHP, l'intervallo valido di un timestamp è effettivamente infinito, poiché 64 bit possono rappresentare circa 293 miliardi di anni in entrambe le direzioni." Quindi si applica solo a 32 bit php.
— Christopher K.

19

Oggi a mezzanotte. Facile.

$stamp = mktime(0, 0, 0);

7

Stai cercando di calcolare l'ora dell'evento celeste più recente in cui il sole è passato direttamente sotto i tuoi piedi, adattato alle convenzioni locali di segnare il mezzogiorno e anche potenzialmente adattato in modo che le persone abbiano abbastanza luce diurna rimasta dopo il ritorno a casa dal lavoro e per altre considerazioni politiche.

Scoraggiante, vero? In realtà questo è un problema comune, ma la risposta completa dipende dalla posizione:

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

Le potenziali definizioni di "qui" sono elencate su https://secure.php.net/manual/en/timezones.php


Come strtotime('America/New_York today midnight');? - 3v4l.org/I85qD
— hakre

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

dovrebbe darti quello che cerchi.

spiegazione

Quello che ho fatto è stato utilizzare la funzione data di PHP per ottenere la data odierna senza alcun riferimento all'ora, quindi passarla alla funzione "string to time" che converte una data e un'ora in un timestamp dell'epoca. Se non ottiene un'ora, presuppone il primo secondo di quel giorno.

Riferimenti: Funzione data: http://php.net/manual/en/function.date.php

String To Time: http://us2.php.net/manual/en/function.strtotime.php


timestamp? È solo un appuntamento.
— mercoledì

Esiste un formato particolare richiesto dall'OP? In tal caso, sarei felice di modificare il mio post per restituire il formato desiderato.
— SamHuckaby

completamente trascurato strtotime(), la mente era così concentrata sulla funzione data. Scuse.
— mercoledì

2

In modo più oggettivo:

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

esempio:

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

e:

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');

equivale a

$timestamp = strtotime('today');

ed è un po 'meno lavoro sul tuo server.


0

$midnight = strtotime('midnight');è valido
Puoi anche provare strtotime('12am')o strtotime('[input any time you wish to here. e.g noon, 6pm, 3pm, 8pm, etc]'). Ho saltato l'aggiunta oggi prima di mezzanotte perché l'impostazione predefinita è oggi.


0

Se stai usando Carbon puoi fare quanto segue. Puoi anche formattare questa data per impostare Expireun'intestazione HTTP.

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

0

Risposta aggiornata il 19 aprile 2020

Semplicemente possiamo farlo:

$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());


La domanda riguarda PHP. Questa risposta è scritta in JavaScript
— Electric Coffee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.