Wie konvertiere ich Datum in Zeitstempel in PHP?


Antworten:


612


Diese Methode funktioniert auf beiden Windows und Unix und ist Zeitzone bewusst, was wahrscheinlich ist , was Sie wollen , wenn Sie mit der Arbeit Daten .

Wenn Sie sich nicht für die Zeitzone interessieren oder die Zeitzone verwenden möchten, die Ihr Server verwendet:

$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 (Dies hängt von Ihrer Server-Zeitzone ab ...)


Wenn Sie angeben möchten, in welcher Zeitzone, hier EST. (Wie 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


Oder wenn Sie UTC verwenden möchten . (Wie " 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


Unabhängig davon ist es immer ein guter Ausgangspunkt, um beim Analysieren von Zeichenfolgen in strukturierte Daten streng zu sein. Dies kann in Zukunft umständliches Debuggen ersparen. Daher empfehle ich, immer das Datumsformat anzugeben.


2
Elegant. Das hatte ich vergessen!
Bis zum

53
Wie kommt es, dass Sie diese Antwort noch nicht erhalten haben?!
Mark Tomlin

4
Eine völlig gültige Antwort, aber ich bin überrascht, dass die Antwort von Armin Ronacher nicht mit den Gegenstimmen übereinstimmt - Mehrdeutigkeit ist IMMER schlecht.
RonLugge

1
@ Devner Nun, auf meinem Server scheint dieses Format nicht unterstützt zu werden. Vielleicht ist es bei dir anders.
Lucas

1
Diese Lösung kann zu einem unerwarteten Verhalten führen. Diejenigen, die PHP 5.3+ verwenden, sollten die Antwort von Prof. Falken übernehmen , bei der man die volle Kontrolle über das Datumsformat hat.
Luca Fagioli

185

Es gibt auch strptime (), das genau ein Format erwartet:

$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
es sollte tm_mon anstelle von tm_month und tm_mday anstelle von tm_day sein
amarillion

68
Beachten Sie, dass die Strptime-Funktion unter Windows nicht verfügbar ist.
Understack

12
Bei Windows und PHP 5.3.0+ sollten Sie date_parse_from_formatanstelle von verwenden strptime.
Erwin Wessels

1
... weil strptimenicht in Windows-Plattformen implementiert ist.
Randell

Da dies eine hoch bewertete Antwort ist, sollten Sie sie in eine Antwort umwandeln, die sowohl unter PHP für Windows als auch unter Unixen funktioniert? Und meiner Meinung nach sollte es idealerweise Zeitzonen erwähnen.
Vertrag von Prof. Falken wurde

126

Mit DateTimeAPI :

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

// or 

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

Das gleiche gilt für die prozedurale API:

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

// or

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

Wenn dies fehlschlägt, weil Sie ein nicht unterstütztes Format verwenden , können Sie es verwenden

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

Beachten Sie, dass, wenn Sie die nicht einstellen !, der Zeitabschnitt auf die aktuelle Zeit eingestellt wird, die sich von den ersten vier unterscheidet, die Mitternacht verwenden, wenn Sie die Zeit weglassen.

Eine weitere Alternative ist die Verwendung der IntlDateFormatterAPI:

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

Wenn Sie nicht mit lokalisierten Datumszeichenfolgen arbeiten, ist DateTime wahrscheinlich die einfachere Wahl.


15
Ich würde dies heutzutage meiner Antwort empfehlen.
Bis zum

Arggg. ! Vergessen Sie nicht, dass sich der auf ! meinem Datum basierende Zeitstempel bei jeder Aktualisierung geändert hat und mich verrückt gemacht hat - denn DateTime hat die aktuelle Zeit hilfreich hinzugefügt, ohne zu fragen oder informiert zu werden. Grrr.

Ich möchte hinzufügen, dass ich gegen mehrdeutiges Datums-Parsen empfehle und dass das Datumsformat beim Parsen von Datumszeichenfolgen explizit angegeben werden sollte.
Vertrag von Prof. Falken wurde

114

Seien Sie vorsichtig mit solchen Funktionen und strtotime()versuchen Sie zu "erraten", was Sie meinen (es wird natürlich nicht erraten, die Regeln sind hier ).

In der Tat 22-09-2008wird als 22. September 2008 analysiert , da dies die einzig vernünftige Sache ist.

Wie wird 08-09-2008analysiert? Voraussichtlich am 9. August 2008 .

Was ist mit 2008-09-50? Einige Versionen von PHP analysieren dies als 20. Oktober 2008 .

Wenn Sie also sicher sind, dass Ihre Eingabe im DD-MM-YYYYFormat vorliegt , ist es besser, die von @Armin Ronacher angebotene Lösung zu verwenden .


5
Gültiges Anliegen. Ich denke, strtotime () hängt von Ihrem Gebietsschema ab.
Bis zum

13
Hinweis: In den meisten nicht englischsprachigen Ländern ist das Format dd-mm-yyyynicht mm-dd-yyyy.
Camilo Martin

1
@CamiloMartin Die meisten nicht englischsprachigen Länder verwenden das erste von Ihnen angegebene Format, aber die Datenbank speichert normalerweise das Datum in. YYYY-mm-ddDie Konvertierung wird nur für die Benutzer
angezeigt

@DannyG hat sich nur die Dokumente angesehen und es scheint, dass Sie Recht haben, wenn Sie mit DB MySQL meinen. Aber es scheint lächerlich, dies zu tun ...
Camilo Martin

57


Diese Methode funktioniert auf beiden Windows und Unix und ist Zeitzone bewusst, was wahrscheinlich ist , was Sie wollen , wenn Sie mit der Arbeit Daten .

Wenn Sie sich nicht für die Zeitzone interessieren oder die Zeitzone verwenden möchten, die Ihr Server verwendet:

$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 (Dies hängt von Ihrer Server-Zeitzone ab ...)


Wenn Sie angeben möchten, in welcher Zeitzone, hier EST. (Wie 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


Oder wenn Sie UTC verwenden möchten . (Wie " 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


Unabhängig davon ist es immer ein guter Ausgangspunkt, um beim Analysieren von Zeichenfolgen in strukturierte Daten streng zu sein. Dies kann in Zukunft umständliches Debuggen ersparen. Daher empfehle ich, immer das Datumsformat anzugeben.


Hey Falken, du bist willkommen. Es ist jedoch wahrscheinlich besser anzugeben, dass diese Lösung für PHP 5.3+ gilt
Luca Fagioli

43

Verwenden von mktime :

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

Das habe ich immer getan. Explodiere es auf - oder / oder. oder was auch immer es getrennt ist, dann mktime.
Rich Bradshaw

1
Im PHP-Handbuch gibt es einen Hinweis zum letzten Parameter der mktime-Funktion: "Ab PHP 5.1.0 ist dieser Parameter veraltet. Daher sollten stattdessen die neuen Funktionen zur Zeitzonenbehandlung verwendet werden." Ich habe noch nicht herausgefunden, über welche neuen Funktionen sie sprechen, da sie nicht damit verknüpft sind!
Sehr unregelmäßig

Dies ist weitaus besser als strtotime()Aus irgendeinem Grund strtotime()funktioniert es an bestimmten Daten nicht und ist daher sehr unzuverlässig.
dspacejs

17

Mit der Funktion strtotime () können Sie Datum und Zeitstempel einfach konvertieren

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

Weitere Informationen: http://php.net/manual/en/function.strtotime.php

Online-Konvertierungstool: http://freeonlinetools24.com/


Für zukünftige Leser war strtotime () ein Unfall und seine Verwendung sollte nicht gefördert werden. Es ist mehrdeutig, weil es versucht, das Datumsformat zu erraten. Selbst wenn Sie es richtig verwenden, wird es schwieriger, Ihren Code zu verstehen und zu begründen, und Sie laufen Gefahr, dass Änderungen an Ihrer Codebasis vorgenommen werden, die zu Fehlern führen, da dies unabhängig davon, was Sie strtotime () geben, zu Änderungen führt es ist am besten zu erraten. Diese Vermutung mag falsch sein, aber Sie erhalten keinen Hinweis darauf, dass sie falsch erraten wurde. Es ist eine Fußwaffe. Verwenden Sie es, wenn Sie möchten, aber Anfänger können eine Einschränkung verwenden, denke ich. Achtung: Fußwaffe voraus
Prof. Falken-Vertrag wurde

12

Hier ist eine sehr einfache und effektive Lösung mit den Funktionen splitund 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);

Es hat wie ein Zauber für mich funktioniert.


Beachten Sie, dass split () jetzt veraltet ist, aber wenn Sie eine alte PHP-Version verwenden, funktioniert es großartig!
Hugo H

6

Da die Funktion unter strptime()Windows nicht funktioniert und strtotime()unerwartete Ergebnisse liefern kann, empfehle ich die Verwendung von 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
Hinweis: Mit strtotime (): Das Trennzeichen ist ein Schrägstrich (/), dann wird das amerikanische m / d / y angenommen. Wenn das Trennzeichen ein Bindestrich (-) oder ein Punkt (.) ist, wird das europäische dmy-Format angenommen. Ich denke also, ich brauche strptime () nicht zu verwenden
secretlm

6

Wenn Sie sicher wissen möchten, ob ein Datum in etwas analysiert wird, das Sie erwarten, können Sie Folgendes verwenden 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

In diesem Fall ist es offensichtlich, aber es 03-04-2008könnte zB der 3. April oder der 4. März sein, je nachdem, woher du kommst :)


1
DateTime::createFromFormat kehrt falsebei Fehler zurück , nicht null.
Mpen

5

Wenn Sie das Format kennen, verwenden Sie, strptimeweil strtotimeeine Vermutung für das Format, die möglicherweise nicht immer korrekt ist. Da strptimees in Windows nicht implementiert ist, gibt es eine benutzerdefinierte Funktion

Denken Sie daran, dass der Rückgabewert tm_yearvon 1900 ist! und tm_monthist 0-11

Beispiel:

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

Wenn Sie möchten, fügen Sie es in einen Zeitstempel des MySQL- Eingabetyps ein. Das obige funktioniert sehr gut (nur in PHP 5 oder höher):

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

3

So würde ich es machen:

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

Auf diese Weise teilen Sie der Funktion mit, welches Datumsformat Sie verwenden, und geben sogar die Zeitzone an.


0

Bitte seien Sie vorsichtig mit der Zeit / Zone, wenn Sie festlegen, dass Daten in der Datenbank gespeichert werden, da beim Vergleichen von Daten aus MySQL, die in " timestampVerwendung" konvertiert wurden, ein Problem aufgetreten ist strtotime. Sie müssen genau dieselbe Zeit / Zone verwenden, bevor Sie das Datum in einen Zeitstempel konvertieren. Andernfalls verwendet strtotime () die Standardserver-Zeitzone.

Bitte sehen Sie dieses Beispiel: 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

Wenn Sie eine UTC datetime ( 2016-02-14T12:24:48.321Z) in einen Zeitstempel konvertieren möchten , gehen Sie wie folgt vor :

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.