Como converter data em timestamp em PHP?


Respostas:


612


Este método funciona em ambos Windows e Unix e é de fuso horário conscientes, que é provavelmente o que você quer se você trabalha com datas .

Se você não se importa com o fuso horário, ou deseja usar o fuso horário que seu servidor usa:

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (Isso varia de acordo com o fuso horário do servidor ...)


Se você deseja especificar em qual fuso horário, aqui EST. (Igual a Nova York.)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


Ou se você deseja usar o UTC . (O mesmo que " GMT ".)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


Independentemente disso, é sempre um bom ponto de partida para ser rigoroso ao analisar seqüências de caracteres em dados estruturados. Ele pode economizar depuração estranha no futuro. Portanto, recomendo sempre especificar o formato da data.


2
Elegante. Eu tinha esquecido disso!
Até

53
Como é que você ainda não recebeu o crédito por esta resposta ?!
Mark Tomlin

4
Uma resposta completamente válida, mas estou surpreso que a resposta de Armin Ronacher não tenha sido comparada com votos positivos - a ambiguidade é SEMPRE ruim.
precisa saber é o seguinte

11
@ Devner Bem, parece que, no meu servidor, esse formato não é suportado. Talvez seja diferente com o seu.
22413 Lucas

11
Esta solução pode levar a um comportamento inesperado. Aqueles que usam o PHP 5.3+ devem adotar a resposta do Prof. Falken , na qual se tem controle total sobre o formato da data.
Luca Fagioli

185

Há também strptime () que espera exatamente um formato:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900);

4
deve ser tm_mon vez de tm_month e tm_mday vez de tm_day
amarillion

68
Cuidado, a função strptime não está disponível no Windows.
understack

12
Aqueles no Windows e PHP 5.3.0+, considere usar em date_parse_from_formatvez de strptime.
Erwin Wessels

11
... porque strptimenão está implementado nas plataformas Windows.
Randell

Como esta é uma resposta altamente votada, você considerará editá-la para uma resposta que funcione tanto no PHP para Windows quanto no unixen? E IMHO, idealmente, deve mencionar fusos horários.
O contrato do Prof. Falken violou

126

Com DateTimeAPI :

$dateTime = new DateTime('2008-09-22'); 
echo $dateTime->format('U'); 

// or 

$date = new DateTime('2008-09-22');
echo $date->getTimestamp();

O mesmo com a API processual:

$date = date_create('2008-09-22');
echo date_format($date, 'U');

// or

$date = date_create('2008-09-22');
echo date_timestamp_get($date);

Se o acima falhar porque você está usando um formato não suportado , você pode usar

$date = DateTime::createFromFormat('!d-m-Y', '22-09-2008');
echo $dateTime->format('U'); 

// or

$date = date_parse_from_format('!d-m-Y', '22-09-2008');
echo date_format($date, 'U');

Observe que, se você não definir !, a parte da hora será definida para a hora atual, diferente das quatro primeiras que usarão a meia-noite quando você omitir a hora.

Outra alternativa é usar a IntlDateFormatterAPI:

$formatter = new IntlDateFormatter(
    'en_US',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'GMT',
    IntlDateFormatter::GREGORIAN,
    'dd-MM-yyyy'
);
echo $formatter->parse('22-09-2008');

A menos que você esteja trabalhando com seqüências de datas localizadas, a escolha mais fácil é provavelmente DateTime.


15
Eu recomendo isso sobre a minha resposta hoje em dia.
Até

Arggg. ! Não se esqueça que o ! registro de data e hora baseado em Minha data estava mudando a cada atualização e me deixando louco - porque o DateTime estava adicionando o horário atual de maneira útil sem perguntar ou ser avisado. Grrr.

Quero acrescentar que eu recomendo a análise de data ambígua e que o formato da data seja fornecido explicitamente ao analisar as seqüências de datas.
O contrato do Prof. Falken violou

114

Tenha cuidado com funções como strtotime()essa, tentando "adivinhar" o que você quer dizer (não adivinha, é claro, as regras estão aqui ).

Na verdade 22-09-2008, será analisado em 22 de setembro de 2008 , pois é a única coisa razoável.

Como será 08-09-2008analisado? Provavelmente 09 de agosto de 2008 .

Que tal 2008-09-50? Algumas versões do PHP analisam isso em 20 de outubro de 2008 .

Portanto, se você tem certeza de que sua entrada está no DD-MM-YYYYformato, é melhor usar a solução oferecida pelo @Armin Ronacher .


5
Preocupação válida. Eu acho que strtotime () depende do seu local.
Até

13
Nota: na maioria dos países que não falam inglês, o formato é dd-mm-yyyynão mm-dd-yyyy.
Camilo Martin

11
@CamiloMartin A maioria dos países falados não-Inglês usar o primeiro formato que você declarou mas a DB normalmente armazenar a data em YYYY-mm-ddA conversão acontece apenas para exibição para os usuários
Danny22

O @ DannyG apenas olhou os documentos e parece que você está certo se por DB você quer dizer MySQL. Mas parece ridícula para fazer isso ...
Camilo Martin

57


Este método funciona em ambos Windows e Unix e é de fuso horário conscientes, que é provavelmente o que você quer se você trabalha com datas .

Se você não se importa com o fuso horário, ou deseja usar o fuso horário que seu servidor usa:

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (Isso varia de acordo com o fuso horário do servidor ...)


Se você deseja especificar em qual fuso horário, aqui EST. (Igual a Nova York.)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


Ou se você deseja usar o UTC . (O mesmo que " GMT ".)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


Independentemente disso, é sempre um bom ponto de partida para ser rigoroso ao analisar seqüências de caracteres em dados estruturados. Ele pode economizar depuração estranha no futuro. Portanto, recomendo sempre especificar o formato da data.


Hey Falken, de nada. No entanto, é provavelmente melhor especificando que esta solução se aplica a PHP 5.3+
Luca Fagioli

43

Usando mktime :

list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);

Isso é o que eu sempre fiz. Exploda-o em - ou / ou. ou o que quer que esteja separado, então mktime.
Rich Bradshaw

11
Há uma observação no manual do PHP para o último parâmetro da função mktime: "A partir do PHP 5.1.0, este parâmetro foi descontinuado. Como resultado, os novos recursos de manipulação do fuso horário devem ser usados." Ainda não descobri quais são os novos recursos sobre os quais eles falam, pois não estão vinculados a ele!
Altamente Irregular

Isso é muito melhor do que. strtotime()Por algum motivo strtotime(), não funciona em determinadas datas e, portanto, é pouco confiável.
Dspacejs 16/05

17

Usando a função strtotime (), você pode facilmente converter a data em carimbo de data / hora

<?php
// set default timezone
date_default_timezone_set('America/Los_Angeles');

//define date and time
$date = date("d M Y H:i:s");

// output
echo strtotime($date);
?> 

Mais informações: http://php.net/manual/en/function.strtotime.php

Ferramenta de conversão online: http://freeonlinetools24.com/


Para futuros leitores - strtotime () foi um acidente e seu uso não deve ser incentivado. É ambíguo, porque tenta adivinhar o formato da data. Mesmo se você usá-lo corretamente, isso torna seu código mais difícil de entender e raciocinar, e você corre o risco de fazer uma alteração em sua base de código que introduzirá erros, porque não importa o que você dê ao strtotime (), ele fará com que é melhor adivinhar. Essa suposição pode estar incorreta, mas você não receberá nenhuma indicação de que ela adivinhou incorretamente. É uma espingarda. Use-o se quiser, mas usuários novatos podem usar uma ressalva, eu acho. Cuidado: espingarda à frente
Contrato do Prof. Falken violado

12

Aqui está uma solução muito simples e eficaz usando as funções splite mtime:

$date="30/07/2010 13:24"; //Date example
list($day, $month, $year, $hour, $minute) = split('[/ :]', $date); 

//The variables should be arranged according to your date format and so the separators
$timestamp = mktime($hour, $minute, 0, $month, $day, $year);
echo date("r", $timestamp);

Funcionou como um encanto para mim.


Note que split () agora está obsoleto, mas se você estiver usando uma versão antiga do php, está funcionando muito bem!
Hugo H

6

Como a função strptime()não funciona no Windows e strtotime()pode retornar resultados inesperados, recomendo usar date_parse_from_format():

$date = date_parse_from_format('d-m-Y', '22-09-2008');
$timestamp = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']);

2
Nota: com strtotime (): o separador é uma barra (/), então o m / d / a americano é assumido; enquanto que se o separador for um hífen (-) ou um ponto (.), o formato dmy europeu é assumido. Então eu acho que não é necessário o uso strptime ()
secretlm

6

Se você deseja saber com certeza se uma data é analisada como esperado, use DateTime::createFromFormat():

$d = DateTime::createFromFormat('d-m-Y', '22-09-2008');
if ($d === false) {
    die("Woah, that date doesn't look right!");
}
echo $d->format('Y-m-d'), PHP_EOL;
// prints 2008-09-22

É óbvio neste caso, mas, por exemplo, 03-04-2008pode ser 3 de abril ou 4 de março, dependendo de onde você vem :)


11
DateTime::createFromFormat retorna falsecom erro , não null.
MPEN

5

Se você sabe que o uso de formato strptimeporque strtotimefaz um palpite para o formato, que pode não ser sempre correto. Como strptimenão é implementado no Windows, há uma função personalizada

Lembre-se de que o valor de retorno tm_yearé de 1900! e tm_monthé 0-11

Exemplo:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900)




3
function date_to_stamp( $date, $slash_time = true, $timezone = 'Europe/London', $expression = "#^\d{2}([^\d]*)\d{2}([^\d]*)\d{4}$#is" ) {
    $return = false;
    $_timezone = date_default_timezone_get();
    date_default_timezone_set( $timezone );
    if( preg_match( $expression, $date, $matches ) )
        $return = date( "Y-m-d " . ( $slash_time ? '00:00:00' : "h:i:s" ), strtotime( str_replace( array($matches[1], $matches[2]), '-', $date ) . ' ' . date("h:i:s") ) );
    date_default_timezone_set( $_timezone );
    return $return;
}

// expression may need changing in relation to timezone
echo date_to_stamp('19/03/1986', false) . '<br />';
echo date_to_stamp('19**03**1986', false) . '<br />';
echo date_to_stamp('19.03.1986') . '<br />';
echo date_to_stamp('19.03.1986', false, 'Asia/Aden') . '<br />';
echo date('Y-m-d h:i:s') . '<br />';

//1986-03-19 02:37:30
//1986-03-19 02:37:30
//1986-03-19 00:00:00
//1986-03-19 05:37:30
//2012-02-12 02:37:30

3
<?php echo date('U') ?>

Se desejar, coloque-o em um registro de data e hora do tipo MySQL . O acima funciona muito bem (apenas no PHP 5 ou posterior):

<?php $timestamp_for_mysql = date('c') ?>

3

Aqui está como eu faria isso:

function dateToTimestamp($date, $format, $timezone='Europe/Belgrade')
{
    //returns an array containing day start and day end timestamps
    $old_timezone=date_timezone_get();
    date_default_timezone_set($timezone);
    $date=strptime($date,$format);
    $day_start=mktime(0,0,0,++$date['tm_mon'],++$date['tm_mday'],($date['tm_year']+1900));
    $day_end=$day_start+(60*60*24);
    date_default_timezone_set($old_timezone);
    return array('day_start'=>$day_start, 'day_end'=>$day_end);
}

$timestamps=dateToTimestamp('15.02.1991.', '%d.%m.%Y.', 'Europe/London');
$day_start=$timestamps['day_start'];

Dessa forma, você deixa a função saber qual formato de data está usando e até especifica o fuso horário.


0

Por favor, tenha cuidado com o fuso horário se você o definir para salvar datas no banco de dados, pois eu tive um problema ao comparar datas do mysql que foram convertidas para timestampuso strtotime. você deve usar exatamente o mesmo fuso horário antes de converter a data em carimbo de data / hora, caso contrário, strtotime () usará o fuso horário do servidor padrão.

Por favor, veja este exemplo: https://3v4l.org/BRlmV

function getthistime($type, $modify = null) {
    $now = new DateTime(null, new DateTimeZone('Asia/Baghdad'));
    if($modify) {
        $now->modify($modify);
    }
    if(!isset($type) || $type == 'datetime') {
        return $now->format('Y-m-d H:i:s');
    }
    if($type == 'time') {
        return $now->format('H:i:s');
    }
    if($type == 'timestamp') {
        return $now->getTimestamp();
    }
}
function timestampfromdate($date) {
    return DateTime::createFromFormat('Y-m-d H:i:s', $date, new DateTimeZone('Asia/Baghdad'))->getTimestamp();
}

echo getthistime('timestamp')."--".
    timestampfromdate(getthistime('datetime'))."--".
    strtotime(getthistime('datetime'));

//getthistime('timestamp') == timestampfromdate(getthistime('datetime')) (true)
//getthistime('timestamp') == strtotime(getthistime('datetime')) (false)

-4

Se você deseja converter um datetime ( 2016-02-14T12:24:48.321Z) UTC em um carimbo de data / hora, veja como você faria isso:

function UTCToTimestamp($utc_datetime_str)
{
    preg_match_all('/(.+?)T(.+?)\.(.*?)Z/i', $utc_datetime_str, $matches_arr);
    $datetime_str = $matches_arr[1][0]." ".$matches_arr[2][0];

    return strtotime($datetime_str);
}

$my_utc_datetime_str = '2016-02-14T12:24:48.321Z';
$my_timestamp_str = UTCToTimestamp($my_utc_datetime_str);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.