¿Cómo convertir la fecha a la marca de tiempo en PHP?


Respuestas:


612


Este método funciona tanto en Windows como en Unix y tiene en cuenta la zona horaria , que es probablemente lo que desea si trabaja con fechas .

Si no le importa la zona horaria o desea utilizar la zona horaria que utiliza su servidor:

$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 (Esto diferirá según la zona horaria de su servidor ...)


Si desea especificar en qué zona horaria, aquí EST. (Igual que Nueva 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


O si quieres usar UTC . (Igual 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


De todos modos, siempre es un buen punto de partida para ser estricto al analizar cadenas en datos estructurados. Puede ahorrar una depuración incómoda en el futuro. Por lo tanto, recomiendo especificar siempre el formato de fecha.


2
Elegante. ¡Me había olvidado de eso!
Hasta el

53
¿Cómo es que aún no has recibido el crédito por esta respuesta?
Mark Tomlin

44
Una respuesta completamente válida, pero me sorprende que la respuesta de Armin Ronacher no haya coincidido en las votaciones: la ambigüedad SIEMPRE es mala.
RonLugge

1
@Devner Bueno, parece que, en mi servidor, ese formato no es compatible. Quizás sea diferente con el tuyo.
Lucas

1
Esta solución puede conducir a un comportamiento inesperado. Aquellos que usan PHP 5.3+ deberían adoptar la respuesta del Prof. Falken , en la cual uno tiene control total sobre el formato de fecha.
Luca Fagioli

185

También hay strptime () que espera exactamente un 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);

44
debería ser tm_mon en lugar de tm_month y tm_mday en lugar de tm_day
amarillion

68
Cuidado, la función strptime no está disponible en Windows.
comprensión

12
Aquellos en Windows y PHP 5.3.0+, considere usar en date_parse_from_formatlugar de strptime.
Erwin Wessels

1
... porque strptimeno está implementado en plataformas Windows.
Randell

Dado que esta es una respuesta muy votada, ¿considerará editarla en una respuesta que funcione tanto en PHP para Windows como en Unixen? Y en mi humilde opinión, idealmente debería mencionar las zonas horarias.
contrato del Prof. Falken incumplió

126

Con DateTimeAPI :

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

// or 

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

Lo mismo con la API de procedimiento:

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

// or

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

Si lo anterior falla porque está usando un formato no compatible , puede 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');

Tenga en cuenta que si no configura !, la parte de tiempo se establecerá en la hora actual, que es diferente de las cuatro primeras que utilizarán la medianoche cuando omita la hora.

Otra alternativa es usar la 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 esté trabajando con cadenas de fecha localizadas, la opción más fácil es probablemente DateTime.


15
Recomendaría esto sobre mi respuesta hoy en día.
Hasta el

Arggg. ! No olvide que la ! marca de fecha y hora basada en Mi fecha cambiaba en cada actualización y me volvía loco, porque DateTime estaba agregando la hora actual sin preguntar ni decir nada. Grrr.

Quiero agregar que recomiendo el análisis de fechas ambiguo, y que el formato de fecha se debe dar explícitamente al analizar cadenas de fechas.
contrato del Prof. Falken incumplió

114

Tenga cuidado con funciones como strtotime()esa, intente "adivinar" lo que quiere decir (no adivina, por supuesto, las reglas están aquí ).

De hecho 22-09-2008, se analizará el 22 de septiembre de 2008 , ya que es lo único razonable.

¿Cómo se 08-09-2008analizará? Probablemente el 09 de agosto de 2008 .

¿Qué hay de 2008-09-50? Algunas versiones de PHP analizan esto el 20 de octubre de 2008 .

Entonces, si está seguro de que su entrada está en DD-MM-YYYYformato, es mejor usar la solución ofrecida por @Armin Ronacher .


55
Válida preocupación. Supongo que strtotime () se basa en su configuración regional.
Hasta el

13
Nota: en la mayoría de los países de habla no inglesa, el formato es dd-mm-yyyy, no mm-dd-yyyy.
Camilo Martin

1
@CamiloMartin La mayoría de los países de habla no inglesa utilizan el primer formato que usted indicó, pero el DB generalmente almacena la fecha en YYYY-mm-ddLa conversión solo se muestra a los usuarios
Danny22

@DannyG solo miró los documentos y parece que tienes razón si por DB te refieres a MySQL. Pero parece ridículo hacer esto ...
Camilo Martin

57


Este método funciona tanto en Windows como en Unix y tiene en cuenta la zona horaria , que es probablemente lo que desea si trabaja con fechas .

Si no le importa la zona horaria o desea utilizar la zona horaria que utiliza su servidor:

$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 (Esto diferirá según la zona horaria de su servidor ...)


Si desea especificar en qué zona horaria, aquí EST. (Igual que Nueva 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


O si quieres usar UTC . (Igual 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


De todos modos, siempre es un buen punto de partida para ser estricto al analizar cadenas en datos estructurados. Puede ahorrar una depuración incómoda en el futuro. Por lo tanto, recomiendo especificar siempre el formato de fecha.


Hola Falken, de nada. Sin embargo, probablemente sea mejor especificar que esta solución 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);

Eso es lo que siempre he hecho. Explótalo en - o / o. o lo que sea que esté separado, entonces mktime.
Rich Bradshaw

1
Hay una nota en el manual de PHP para el último parámetro de la función mktime: "A partir de PHP 5.1.0, este parámetro quedó en desuso. Como resultado, las nuevas funciones de manejo de zona horaria deberían usarse en su lugar". Aún no he descubierto cuáles son las nuevas características de las que hablan, ya que no se han vinculado a ellas.
Muy irregular el

Esto es mucho mejor que strtotime()por alguna razón strtotime()no funciona en ciertas fechas y, por lo tanto, es poco confiable.
dspacejs

17

Usando la función strtotime () puede convertir fácilmente la fecha a la marca de tiempo

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

Más información: http://php.net/manual/en/function.strtotime.php

Herramienta de conversión en línea: http://freeonlinetools24.com/


Para futuros lectores: strtotime () fue un accidente y no se debe alentar su uso. Es ambiguo, porque trata de adivinar el formato de fecha. Incluso si lo usa correctamente, hace que su código sea más difícil de entender y razonar, y corre el riesgo de que se realice un cambio en su base de código que introducirá errores, porque no importa lo que le dé a strtotime (), hará que Es mejor adivinar. Esa suposición puede ser incorrecta, pero no obtendrá ninguna indicación de que haya adivinado incorrectamente. Es una pistola de pie. Úselo si lo desea, pero los usuarios novatos pueden usar una advertencia, creo. Precaución: pistolas por delante
el contrato del Prof. Falken incumplió

12

Aquí hay una solución muy simple y efectiva usando las funciones splity 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);

Funcionó como un encanto para mí.


Tenga en cuenta que split () ahora está en desuso, pero si está utilizando una versión ol 'php, ¡está funcionando muy bien!
Hugo H

6

Dado que la función strptime()no funciona para Windows y strtotime()puede devolver resultados inesperados, recomiendo 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: con strtotime (): el separador es una barra oblicua (/), entonces se supone el m / d / a estadounidense; mientras que si el separador es un guión (-) o un punto (.), entonces se supone el formato dmy europeo. Así que creo que no necesito usar strptime ()
secretlm

6

Si desea saber con certeza si una fecha se analiza en algo que espera, puede usar 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

Es obvio en este caso, pero, por ejemplo, 03-04-2008podría ser el 3 de abril o el 4 de marzo, dependiendo de dónde vengas :)


1
DateTime::createFromFormat vuelve falsepor error , no null.
mpen

5

Si conoce el uso del formato strptimeporque strtotimeadivina el formato, lo que no siempre es correcto. Como strptimeno está implementado en Windows, hay una función personalizada

¡Recuerde que el valor de retorno tm_yeares de 1900! y tm_monthes 0-11

Ejemplo:

$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') ?>

Si lo desea, póngalo en una marca de tiempo del tipo de entrada MySQL . Lo anterior funciona muy bien (solo en PHP 5 o posterior):

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

3

Así es como lo haría:

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

De esta manera, le permite a la función saber qué formato de fecha está utilizando e incluso especificar la zona horaria.


0

Tenga cuidado con la hora / zona si la configura para guardar fechas en la base de datos, ya que tuve un problema al comparar las fechas de mysql que se convirtieron al timestampusostrtotime . debe usar exactamente la misma hora / zona antes de convertir la fecha a la marca de tiempo; de lo contrario, strtotime () usará la zona horaria predeterminada del servidor.

Por favor vea este ejemplo: 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

Si está buscando convertir una fecha y hora UTC ( 2016-02-14T12:24:48.321Z) en marca de tiempo, así es como lo haría:

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.