web-dev-qa-db-ja.com

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

どのように私はからタイムスタンプを取得するのですか? 22-09-2008

318
Wizard4U
576
Owen

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);
182
Armin Ronacher

DateTime APIを使用

$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つとは異なります。

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

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

ローカライズされた日付文字列を扱っているのでなければ、DateTimeを使うほうが簡単です。

120
Gordon

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

確かに22-09-2008 2008年9月22日 として解析されます。これが唯一の合理的な理由です。

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

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

そのため、入力がDD-MM-YYYY形式であることが確実な場合は、 @Armin Ronacher が提供する解決策を使用することをお勧めします。

114
daremon


PHP 5.3以上の場合

このメソッドはboth WindowsとUnixで動作しますandtime-zone awareです。これは日付を扱うことに真剣に取り組む場合におそらく必要です。 。

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

$d = DateTime::createFromFormat('d-m-Y', '22-09-2008');
echo $d->getTimestamp();

1222093324 (これはサーバーのタイムゾーンによって異なります...)


どのタイムゾーンで指定するかは、ここでESTです。 (ニューヨークと同じ)

$d = DateTime::createFromFormat('d-m-Y', '22-09-2008', new DateTimeZone('EST'));
echo $d->getTimestamp();

1222093305


または、UTCを使いたい場合( "GMT"と同じです。)

$d = DateTime::createFromFormat('d-m-Y', '22-09-2008', new DateTimeZone('UTC'));
echo $d->getTimestamp();

1222093289


48
Prof. Falken

mktime を使用する

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

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/ /

17
klit67

これは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);

それは私にとって魅力的なように働いた。

13
Victor Bojica

関数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']);
7
Victor

日付が期待したものに解析されるかどうかを確実に知りたい場合は、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日になる可能性があります。

6
Ja͢ck
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>

http://php.net/manual/en/function.date.php

5

strptimeがフォーマットを推測するので、フォーマットがstrtotimeを使用していることを知っているなら、それは常に正しいとは限りません。 strptimeはWindowsには実装されていないので、カスタム関数があります。

戻り値tm_yearは1900年のものです。そしてtm_monthは0-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)
5
blavla
$time = '22-09-2008';
echo strtotime($time);
5
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
4
Phil Jackson

これが私のやり方です。

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

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

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

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

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

timestampを使用してstrtotimeに変換したmysqlの日付を比較したときに問題が発生したため、日付をデータベースに保存するように設定した場合は、時間/ゾーンに注意してください。それ以外の場合は、日付をタイムスタンプに変換する前にまったく同じ時間/ゾーンを使用する必要があります。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)
1
Akam

PHP function strtotime()を使用してください。

echo strtotime( '2019/06/06');

日付 - 現地時間/日付のフォーマット

0
Gurpreet Singh