Obtendo um timestamp para hoje à meia-noite?

123

Como eu faria para obter um timestamp em php para hoje à meia-noite. Digamos que seja segunda-feira às 17h e eu queira o timestamp para segunda-feira (hoje) à meia-noite (12h), o que já aconteceu.

Obrigado

user1701398
fonte
Meia-noite não é da manhã nem da tarde. Além disso, tecnicamente, não existe nenhum carimbo de data / hora para meia-noite.
hakre
16
@hakre eu discordo de você. Meia-noite é am e qualquer que seja o formato do carimbo de data / hora, há um valor para meia-noite.
G-Nugget
1
se 00:00:00 considerado hoje ou amanhã. A meia-noite de hoje está atrás de nós, em quase todos os momentos, tecnicamente. Você quer 23:59:59 de "hoje à noite" ou 00:00:00 "meia-noite de hoje, que é amanhã", mais ou menos.
wesside
5
um horário de 00:00:00 seria a meia-noite de hoje como o tempo que leva para chegar às 00:00:00 que já aconteceram. onde 23:59:59 seria esta noite. Se você está falando em termos de hoje. Meia-noite é AM.
Nazca
4
00:00 é meia-noite no início de um dia, 24:00 é meia-noite no final de um dia. Para simplificar, entretanto, a maioria dos relógios digitais pula as 24:00 - declarando que a meia-noite é o início de um novo dia. Ou seja, 8 de fevereiro às 24:00 e 9 de fevereiro às 00:00 é, na prática, o mesmo ponto no tempo.
Johan

Respostas:

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

Você pode querer dar uma olhada no que o PHP tem a oferecer: http://php.net/datetime

hakre
fonte
52
@SamHuckaby: É ainda mais fácil: $timestamp = strtotime('today');é meia-noite. Mas pssst, o acima parece mais legal como uma resposta à pergunta;)
hakre
Na verdade, preciso começar hoje e meia-noite de hoje. Como posso encontrar o início de hoje, quero dizer, às 00:00:00
Happy Coder
3
@AlwinAugustin: Você deve considerar a possibilidade de diferir seu texto. A meia-noite é tecnicamente entre dois dias. Portanto, existe um tipo de "não hoje mais". Além disso: Midgnight de hoje (por definição) é (logo antes) o início de hoje. Você provavelmente quer dizer a próxima meia-noite depois do meio-dia de hoje .
hakre
sim, na verdade, o que eu preciso é 00:00:00 de hoje e 23:59:59 de hoje
Happy Coder
2
Lembre-se de que isso produzirá a meia-noite do fuso horário do seu servidor PHP, não UTC + 0 ! Para obter UTC + 0, você pode usar strtotime('today+00:00').
mae de
73

Eu acho que você deve usar o novo objeto PHP DateTime, pois ele não tem problemas com datas além das restrições de 32 bits que strtotime () tem. Aqui está um exemplo de como você obteria a data de hoje à meia-noite.

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

Ou se estiver usando PHP 5.4 ou posterior, você pode fazer desta forma:

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

Em seguida, você pode usar o echo $today->format('Y-m-d');para obter o formato que deseja como a saída do objeto.

Objeto PHP DateTime

Joe Meyer
fonte
14
Também prefiro usar o novo objeto DateTime. Se você combinar esta resposta com @hakr's, obterá:, o new DateTime('today midnight')que torna a intenção mais clara (mas isso é obviamente uma questão de gosto).
Martijn de
1
Estou fazendo um trabalho ORM SQL e tive que usar o objeto DateTime para comparações. Isso é exatamente o que eu estava procurando. +1
NobleUplift
Pode ser$today = new DateTime('today')
ProgZi
Também é útil se você estiver usando Carbon, que herda de DateTime. Assim, você também pode fazer new Carbon('today midnight')e usar todas as coisas de Carbono como ->subDays(6). Consulte carbon.nesbot.com
Christopher K.
Com relação à restrição de 32 bits: O documento PHP para strtotime afirma : "Para versões de 64 bits do PHP, o intervalo válido de um carimbo de data / hora é efetivamente infinito, já que 64 bits podem representar aproximadamente 293 bilhões de anos em qualquer direção." Portanto, só se aplica a php de 32 bits.
Christopher K.
19

Hoje à meia-noite. Fácil.

$stamp = mktime(0, 0, 0);
Bearcat
fonte
7

Você está tentando calcular a hora do evento celestial mais recente em que o sol passou diretamente abaixo de seus pés, ajustada para as convenções locais de marcar o meio-dia e também potencialmente ajustando para que as pessoas tenham luz do dia suficiente após voltar para casa do trabalho, e para outras considerações políticas.

Assustador, certo? Na verdade, este é um problema comum, mas a resposta completa depende da localização:

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

As definições potenciais de “aqui” estão listadas em https://secure.php.net/manual/en/timezones.php

William Entriken
fonte
Gostou strtotime('America/New_York today midnight');? - 3v4l.org/I85qD
hakre
5
$today_at_midnight = strtotime(date("Ymd"));

deve dar a você o que você procura.

explicação

O que fiz foi usar a função de data do PHP para obter a data de hoje sem nenhuma referência ao tempo e, em seguida, passá-lo para a função 'string to time' que converte uma data e hora em um carimbo de data / hora de época. Se não chegar a hora, assume o primeiro segundo daquele dia.

Referências: Função de data: http://php.net/manual/en/function.date.php

String para o tempo: http://us2.php.net/manual/en/function.strtotime.php

SamHuckaby
fonte
timestamp? Isso é apenas um encontro.
wesside
Existe um formato específico que o OP solicitou? Nesse caso, ficaria feliz em modificar minha postagem para retornar o formato que eles desejarem.
SamHuckaby
completamente esquecido strtotime(), a mente estava tão focada na função de data. Desculpas.
wesside
2

De forma mais objetiva:

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

exemplo:

 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
Jan Galtowski
fonte
1
$timestamp = strtotime('today midnight');

é o mesmo que

$timestamp = strtotime('today');

e é um pouco menos trabalhoso no seu servidor.

Caso
fonte
0

$midnight = strtotime('midnight');é válido.
Você também pode experimentar strtotime('12am')ou strtotime('[input any time you wish to here. e.g noon, 6pm, 3pm, 8pm, etc]'). Ignorei a adição de hoje antes da meia-noite porque o padrão é hoje.

Victor Mbamara
fonte
0

Se estiver usando Carbon, você pode fazer o seguinte. Você também pode formatar essa data para definir um Expirecabeçalho HTTP.

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

Resposta atualizada em 19 de abril de 2020

Simplesmente podemos fazer isso:

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

aspile
fonte
-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());

Avinash_ks
fonte
A questão está relacionada ao PHP. Esta resposta está escrita em JavaScript
Electric Coffee