Comment convertir la date en horodatage en PHP?


Réponses:


612


Cette méthode fonctionne à la fois sur Windows et Unix et est sensible au fuseau horaire , ce qui est probablement ce que vous voulez si vous travaillez avec des dates .

Si vous ne vous souciez pas du fuseau horaire ou si vous souhaitez utiliser le fuseau horaire utilisé par votre serveur:

$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 (cela varie en fonction du fuseau horaire de votre serveur ...)


Si vous souhaitez spécifier dans quel fuseau horaire, ici EST. (Identique à New 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 si vous souhaitez utiliser UTC . (Identique à " 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


Quoi qu'il en soit, c'est toujours un bon point de départ pour être strict lors de l'analyse des chaînes en données structurées. Il peut sauver un débogage gênant à l'avenir. Par conséquent, je recommande de toujours spécifier le format de date.


2
Élégant. J'avais oublié ça!
jusqu'au

53
Comment se fait-il que vous n'ayez pas encore obtenu le crédit pour cette réponse?!
Mark Tomlin

4
Une réponse tout à fait valable, mais je suis surpris que la réponse d'Armin Ronacher ne l'ait pas égalée dans les votes positifs - l'ambiguïté est TOUJOURS mauvaise.
RonLugge

1
@Devner Eh bien, il semble que ce format ne soit pas pris en charge sur mon serveur. C'est peut-être différent avec le vôtre.
Lucas

1
Cette solution peut entraîner un comportement inattendu. Ceux qui utilisent PHP 5.3+ devraient adopter la réponse du professeur Falken , dans laquelle on a un contrôle total sur le format de la date.
Luca Fagioli

185

Il existe également strptime () qui attend exactement un format:

$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
il devrait être tm_mon au lieu de tm_month et tm_mday au lieu de tm_day
amarillion

68
Attention, la fonction strptime n'est pas disponible sous Windows.
sous

12
Ceux sur Windows et PHP 5.3.0+, envisagez d'utiliser à la date_parse_from_formatplace de strptime.
Erwin Wessels

1
... car strptimen'est pas implémenté sur les plateformes Windows.
Randell

Puisqu'il s'agit d'une réponse très votée, envisagerez-vous de la modifier en une réponse qui fonctionne sur PHP pour Windows ainsi que sur Unixen? Et à mon humble avis, il devrait mentionner les fuseaux horaires.
contrat du professeur Falken a été rompu

126

Avec l' DateTimeAPI :

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

// or 

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

La même chose avec l'API procédurale:

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

// or

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

Si ce qui précède échoue parce que vous utilisez un format non pris en charge , vous pouvez utiliser

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

Notez que si vous ne définissez pas le !, la partie heure sera définie sur l'heure actuelle, qui est différente des quatre premières qui utiliseront minuit lorsque vous omettez l'heure.

Encore une autre alternative consiste à utiliser l' IntlDateFormatterAPI:

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

Sauf si vous travaillez avec des chaînes de date localisées, le choix le plus simple est probablement DateTime.


15
Je recommanderais ceci sur ma réponse de nos jours.
jusqu'au

Arggg. ! N'oubliez pas que l' ! horodatage basé sur Ma date changeait à chaque rafraîchissement et me rendait fou - parce que DateTime ajoutait utilement l'heure actuelle sans demander ni être informé. Grrr.

Je veux ajouter que je déconseille l'analyse de date ambiguë et que le format de date doit être indiqué explicitement lors de l'analyse des chaînes de date.
contrat du professeur Falken a été rompu

114

Soyez prudent avec des fonctions comme strtotime()celle-ci, essayez de "deviner" ce que vous voulez dire (cela ne devine pas bien sûr, les règles sont là ).

En effet 22-09-2008sera analysé au 22 septembre 2008 , car c'est la seule chose raisonnable.

Comment sera 08-09-2008analysé? Probablement le 09 août 2008 .

Et alors 2008-09-50? Certaines versions de PHP analysent cela au 20 octobre 2008 .

Donc, si vous êtes sûr que votre entrée est au DD-MM-YYYYformat, il est préférable d'utiliser la solution proposée par @Armin Ronacher .


5
Préoccupation valable. Je suppose que strtotime () repose sur vos paramètres régionaux.
jusqu'au

13
Remarque: dans la plupart des pays non anglophones, le format ne l'est dd-mm-yyyypas mm-dd-yyyy.
Camilo Martin

1
@CamiloMartin La plupart des pays non anglophones utilisent le premier format que vous avez indiqué, mais la base de données stocke généralement la date dans YYYY-mm-ddLa conversion ne s'affiche que pour les utilisateurs
Danny22

@DannyG vient de regarder les documents et il semble que vous ayez raison si par DB vous voulez dire MySQL. Mais cela semble ridicule de le faire ...
Camilo Martin

57


Cette méthode fonctionne à la fois sur Windows et Unix et est sensible au fuseau horaire , ce qui est probablement ce que vous voulez si vous travaillez avec des dates .

Si vous ne vous souciez pas du fuseau horaire ou si vous souhaitez utiliser le fuseau horaire utilisé par votre serveur:

$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 (cela varie en fonction du fuseau horaire de votre serveur ...)


Si vous souhaitez spécifier dans quel fuseau horaire, ici EST. (Identique à New 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 si vous souhaitez utiliser UTC . (Identique à " 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


Quoi qu'il en soit, c'est toujours un bon point de départ pour être strict lors de l'analyse des chaînes en données structurées. Il peut sauver un débogage gênant à l'avenir. Par conséquent, je recommande de toujours spécifier le format de date.


Salut Falken, tu es le bienvenu. Cependant, il est probablement préférable de préciser que cette solution s'applique à PHP 5.3+
Luca Fagioli

43

Utilisation de mktime :

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

C'est ce que j'ai toujours fait. Explosez-le sur - ou / ou. ou quoi que ce soit séparé, puis mktime.
Rich Bradshaw

1
Il y a une note dans le manuel PHP pour le dernier paramètre de la fonction mktime: "Depuis PHP 5.1.0, ce paramètre est devenu obsolète. Par conséquent, les nouvelles fonctionnalités de gestion du fuseau horaire devraient être utilisées à la place." Je n'ai pas encore découvert les nouvelles fonctionnalités dont ils parlent, car ils n'y sont pas liés!
Très irrégulier du

C'est bien mieux que strtotime()pour une raison quelconque, strtotime()cela ne fonctionne pas à certaines dates et est donc très peu fiable.
dspacejs

17

En utilisant la fonction strtotime (), vous pouvez facilement convertir la date en horodatage

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

Plus d'informations: http://php.net/manual/en/function.strtotime.php

Outil de conversion en ligne: http://freeonlinetools24.com/


Pour les futurs lecteurs - strtotime () était un accident et son utilisation ne devrait pas être encouragée. C'est ambigu, car il essaie de deviner le format de la date. Même si vous l'utilisez correctement, cela rend votre code plus difficile à comprendre et à raisonner et vous courez le risque qu'une modification soit apportée à votre base de code qui introduira des erreurs, car peu importe ce que vous donnez à strtotime (), cela rendra il vaut mieux deviner. Cette supposition peut être incorrecte, mais vous n'aurez aucune indication qu'elle a mal deviné. C'est un pistolet. Utilisez-le si vous le souhaitez, mais les utilisateurs novices peuvent utiliser une mise en garde, je pense. Attention: arme de poing devant
contrat du professeur Falken a été

12

Voici une solution très simple et efficace utilisant les fonctions splitet 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);

Cela a fonctionné comme un charme pour moi.


Notez que split () est désormais obsolète, mais si vous utilisez une ancienne version php, cela fonctionne très bien!
Hugo H

6

Étant donné que la fonction strptime()ne fonctionne pas pour Windows et strtotime()peut renvoyer des résultats inattendus, je recommande d'utiliser 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
Remarque: avec strtotime (): le séparateur est une barre oblique (/), alors le m / d / y américain est supposé; alors que si le séparateur est un tiret (-) ou un point (.), alors le format européen dmy est supposé. Je pense donc que je n'ai pas besoin d'utiliser strptime ()
secretlm

6

Si vous voulez savoir avec certitude si une date est analysée dans quelque chose que vous attendez, vous pouvez utiliser 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

C'est évident dans ce cas, mais par exemple 03-04-2008pourrait être le 3 avril ou le 4 mars selon d'où vous venez :)


1
DateTime::createFromFormat renvoie falsesur erreur , non null.
mpen

5

Si vous connaissez le format, utilisez strptimeparce qu'il strtotimefait une supposition pour le format, ce qui n'est pas toujours correct. Puisqu'il strptimen'est pas implémenté dans Windows, il existe une fonction personnalisée

N'oubliez pas que la valeur de retour tm_yearest de 1900! et tm_monthest 0-11

Exemple:

$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 vous le souhaitez, placez-le dans un horodatage de type d'entrée MySQL . Ce qui précède fonctionne très bien (uniquement en PHP 5 ou version ultérieure):

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

3

Voici comment je le ferais:

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 cette façon, vous indiquez à la fonction le format de date que vous utilisez et spécifiez même le fuseau horaire.


0

Veuillez faire attention au fuseau horaire si vous le définissez pour enregistrer les dates dans la base de données, car j'ai eu un problème lorsque j'ai comparé les dates de mysql converties en timestamputilisant strtotime. vous devez utiliser exactement la même heure / zone avant de convertir la date en horodatage sinon strtotime () utilisera le fuseau horaire du serveur par défaut.

Veuillez voir cet exemple: 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 vous cherchez à convertir un datetime UTC ( 2016-02-14T12:24:48.321Z) en horodatage, voici comment procéder:

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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.