PHPで日付をタイムスタンプに変換する方法は?


350

たとえば、どうやってタイムスタンプを取得するの22-09-2008ですか?

回答:


612


この方法は、上で動作し、両方の WindowsとUnix タイムゾーンあなたが働けば、あなたが望むものはおそらくである、注意してください日付

タイムゾーンを気にしない、またはサーバーが使用するタイムゾーンを使用したい場合:

$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 (これはサーバーのタイムゾーンによって異なります...)


どのタイムゾーンで指定するかは、ESTを使用してください。(ニューヨークと同じ。)

$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


または、UTCを使用する場合。(「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


いずれにせよ、文字列を構造化データに解析する際には、常に厳密な出発点となるでしょう。将来、面倒なデバッグを省くことができます。したがって、常に日付形式を指定することをお勧めします。


2
エレガント。忘れちゃった!
ティル

53
この回答のクレジットをまだ取得していないのはどうしてですか。
Mark Tomlin

4
完全に有効な回答ですが、Armin Ronacherの回答が賛成投票でそれと一致しなかったことに驚いています-あいまいさは常に悪いです。
RonLugge 2013年

1
@Devnerまあ、私のサーバーでは、そのフォーマットはサポートされていないようです。多分それはあなたのものとは異なります。
Lucas

1
このソリューションは、予期しない動作を引き起こす可能性があります。PHP 5.3+を使用する場合は、日付形式を完全に制御できるFalken教授の回答を採用する必要があります。
Luca Fagioli、2015

185

厳密に1つの形式を期待するstrptime()もあります。

$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
tm_monthではなくtm_monであり、tm_dayではなくtm_mdayである必要があります
amarillion

68
Windowsではstrptime関数は使用できません。
understack

12
WindowsおよびPHP 5.3.0以降の場合は、のdate_parse_from_format代わりに使用することを検討してくださいstrptime
アーウィンウェッセルズ2013年

1
... strptimeはWindowsプラットフォームに実装されていないためです。
ランデル、2015年

これは非常に投票された回答なので、Windows用のPHPとunixenで機能する回答に編集することを検討しますか?そして、私見は理想的にはタイムゾーンについて言及すべきです。
ファルケン教授の契約が

126

DateTimeAPI

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

// or 

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

手続き型APIでも同じです。

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

// or

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

サポートされていない形式を使用しているために上記が失敗した場合は、

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

を設定しない場合!、時間部分は現在の時刻に設定されます。これは、時刻を省略したときに真夜中を使用する最初の4つとは異なります。

さらに別の方法は、IntlDateFormatterAPI を使用することです。

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

ローカライズされた日付文字列を使用しているのでない限り、より簡単な選択はおそらくDateTimeです。


15
私は最近、私の答えよりもこれをお勧めします。
までの

Arggg。!! 私の日付ベースのタイムスタンプは更新のたびに変化し、私を怒らせたことを忘れないでください。Grrr。

あいまいな日付の解析に対して推奨し、日付文字列を解析するときに日付形式を明示的に指定する必要があることを付け加えておきます。
ファルケン教授の契約が

114

このような関数はstrtotime()、あなたが何を意味するのかを「推測」しようとすることに注意してください(もちろん、ルールはここにあります)。

実際、それは2008年9月22日としてのみ22-09-2008解析されます。

どのよう08-09-2008に解析されますか?おそらく2008年8月9日

どう2008-09-50ですか?PHPの一部のバージョンでは、これを2008年10月20日として解析します。

したがって、入力がDD-MM-YYYYフォーマットであることが確実な場合は、@ Armin Ronacherが提供するソリューションを使用することをお勧めします。


5
妥当な懸念。strtotime()はあなたのロケールに依存していると思います。
ティル

13
注:ほとんどの非英語圏の国では、形式はdd-mm-yyyyであり、ではありませんmm-dd-yyyy
Camilo Martin

1
@CamiloMartin英語以外のほとんどの話された国はあなたが述べた最初のフォーマットを使用しますが、DBは通常日付を格納しますYYYY-mm-dd変換はユーザーに表示するためだけに起こります
Danny22

@DannyG はドキュメントを調べただけで DBがMySQLを意味するのであればあなたは正しいようです。しかし、これを行うのはばかげているように見えます...
Camilo Martin

57


この方法は、上で動作し、両方の WindowsとUnix タイムゾーンあなたが働けば、あなたが望むものはおそらくである、注意してください日付

タイムゾーンを気にしない、またはサーバーが使用するタイムゾーンを使用したい場合:

$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 (これはサーバーのタイムゾーンによって異なります...)


どのタイムゾーンで指定するかは、ESTを使用してください。(ニューヨークと同じ。)

$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


または、UTCを使用する場合。(「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


いずれにせよ、文字列を構造化データに解析する際には、常に厳密な出発点となるでしょう。将来、面倒なデバッグを省くことができます。したがって、常に日付形式を指定することをお勧めします。


ファルケンさん、どういたしまして。ただし、おそらくこのソリューションがPHP 5.3+に適用されることを明記する方がよいでしょう
Luca Fagioli

43

mktimeの使用:

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

それは私がいつもしてきたことです。-または/またはで爆発します。またはそれが区切られているものは何でも、それからmktime。
リッチブラッドショー

1
PHPマニュアルには、mktime関数の最後のパラメーターに関する注記があります。「PHP 5.1.0以降、このパラメーターは非推奨になりました。その結果、代わりに新しいタイムゾーン処理機能を使用する必要があります。」彼らがそれにリンクしていないので、私はまだ彼らが話す新機能が何であるかを発見していません!
非常に不規則な

これは、strtotime()何らかの理由strtotime()で特定の日付で機能しないため、はるかに優れているため、信頼性が非常に低くなります。
dspacejs

17

strtotime()関数を使用すると、日付をタイムスタンプに簡単に変換できます

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

詳細:http : //php.net/manual/en/function.strtotime.php

オンライン変換ツール:http : //freeonlinetools24.com/


将来の読者にとって-strtotime()は偶然であり、その使用は推奨されるべきではありません。日付形式で推測しようとするため、あいまいです。それを正しく使用しても、コードの理解と推論が困難になり、コードベースに変更が加えられるリスクが発生し、エラーが発生します。strtotime()に何を指定しても、推測するのが最善です。その推測は正しくない可能性がありますが、間違って推測したことはわかりません。それは歩兵です。必要に応じて使用してください。ただし、初心者のユーザーは警告を使用できます。注意:先を行くフットガン
ファルケン教授の契約が

12

splitmtime関数を使用した非常にシンプルで効果的なソリューションを次に示します。

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

それは私にとって魅力のように働きました。


なお、split()は非推奨になりましたが、olのphpバージョンを使用している場合は問題なく動作します。
Hugo H

6

この関数strptime()はWindowsでは機能せずstrtotime()、予期しない結果を返す可能性があるため、次の使用をお勧めし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
注:strtotime()の場合:区切り文字はスラッシュ(/)であり、アメリカのm / d / yが想定されます。一方、区切り文字がダッシュ(-)またはドット(。)の場合は、ヨーロッパのdmy形式が想定されます。したがって、strptime()を使用する必要はないと思います
secretlm

6

日付が期待したものに解析されるかどうかを確実に知りたい場合は、次を使用できます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

この場合は明らかですが、たとえば、03-04-2008出身地に応じて4月3日または3月4日になる場合があります。


1
DateTime::createFromFormat falseエラーではなく、を返しますnull
mpen 2014

5

が形式の推測を行うstrptimeため、形式の使用を知っている場合strtotime、これは常に正しいとは限りません。以来strptime、Windowsで実装されていないカスタム関数があります

戻り値tm_yearは1900からであることを忘れないでください!そしてtm_month0-11

例:

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

必要に応じて、MySQLに配置します入力タイプのタイムスタンプに入れます。上記は非常にうまく機能します(PHP 5以降でのみ):

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

3

ここに私がそれをする方法があります:

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

このようにして、使用している日付形式を関数に通知し、さらにタイムゾーンを指定します。


0

データベースに日付を保存するように設定する場合は、時間/ゾーンに注意してください。mysqlから日付を比較すると問題が発生したためtimestampstrtotime。にです。日付をタイムスタンプに変換する前に、正確に同じ時間/ゾーンを使用する必要があります。そうでない場合、strtotime()はデフォルトのサーバータイムゾーンを使用します。

この例を参照してください: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

UTC日時(2016-02-14T12:24:48.321Z)をタイムスタンプに変換する場合は、次のようにします。

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.