Bagaimana cara mengubah tanggal ke cap waktu di PHP?


Jawaban:


612


Metode ini bekerja pada kedua Windows dan Unix dan merupakan zona waktu sadar, yang mungkin apa yang Anda inginkan jika Anda bekerja dengan tanggal .

Jika Anda tidak peduli dengan zona waktu, atau ingin menggunakan zona waktu yang digunakan server Anda:

$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 (Ini akan berbeda tergantung pada zona waktu server Anda ...)


Jika Anda ingin menentukan zona waktu mana, di sini EST. (Sama seperti 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


Atau jika Anda ingin menggunakan UTC . (Sama seperti " 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


Apapun, itu selalu merupakan titik awal yang baik untuk menjadi ketat ketika mem-parsing string menjadi data terstruktur. Itu dapat menyimpan debugging yang aneh di masa depan. Karena itu saya sarankan untuk selalu menentukan format tanggal.


2
Anggun. Saya sudah lupa tentang itu!
Hingga

53
Bagaimana Anda belum mendapat pujian untuk jawaban ini ?!
Mark Tomlin

4
Sebuah jawaban yang benar-benar valid, tetapi saya terkejut bahwa jawaban Armin Ronacher tidak cocok dalam upvotes - ambiguitas itu SELALU buruk.
RonLugge

1
@ David Yah, sepertinya, di server saya, format itu tidak didukung. Mungkin berbeda dengan milikmu.
Lucas

1
Solusi ini dapat menyebabkan perilaku yang tidak terduga. Mereka yang menggunakan PHP 5.3+ harus mengadopsi jawaban Prof. Falken , di mana orang memiliki kontrol penuh atas format tanggal.
Luca Fagioli

185

Ada juga strptime () yang mengharapkan tepat satu 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
seharusnya tm_mon bukan tm_month dan tm_mday bukannya tm_day
amarillion

68
Hati-hati, fungsi strptime tidak tersedia di Windows.
understack

12
Mereka pada Windows dan PHP 5.3.0+, pertimbangkan untuk menggunakan date_parse_from_formatbukan strptime.
Erwin Wessels

1
... karena strptimetidak diterapkan pada platform Windows.
Randell

Karena ini adalah jawaban yang sangat dipilih, akankah Anda mempertimbangkan untuk mengeditnya menjadi jawaban yang berfungsi pada PHP untuk Windows dan juga yang belum dilepas? Dan IMHO idealnya harus menyebutkan zona waktu.
Kontrak Prof. Falken dibatalkan

126

Dengan DateTimeAPI :

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

// or 

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

Sama dengan API prosedural:

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

// or

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

Jika hal di atas gagal karena Anda menggunakan format yang tidak didukung , Anda dapat menggunakan

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

Perhatikan bahwa jika Anda tidak mengatur !, porsi waktu akan diatur ke waktu saat ini, yang berbeda dari empat yang pertama yang akan menggunakan tengah malam ketika Anda menghilangkan waktu.

Alternatif lain adalah menggunakan IntlDateFormatterAPI:

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

Kecuali jika Anda bekerja dengan string tanggal lokal, pilihan yang lebih mudah adalah DateTime.


15
Saya akan merekomendasikan ini untuk jawaban saya saat ini.
Hingga

Arggg. ! Jangan lupa ! cap waktu berdasarkan tanggal saya berubah pada setiap penyegaran dan membuat saya marah - karena DateTime sangat membantu menambah waktu saat ini tanpa bertanya atau diberitahu. Grrr.

Saya ingin menambahkan bahwa saya merekomendasikan terhadap parsing tanggal ambigu, dan bahwa format tanggal harus diberikan secara eksplisit ketika parsing string tanggal.
Kontrak Prof. Falken dilanggar

114

Berhati-hatilah dengan fungsi-fungsi seperti strtotime()itu yang mencoba "menebak" apa yang Anda maksudkan (tidak menebak tentu saja, aturannya ada di sini ).

Memang 22-09-2008akan diuraikan sebagai 22 September 2008 , karena itu adalah satu-satunya hal yang masuk akal.

Bagaimana akan 08-09-2008diuraikan? Mungkin 09 Agustus 2008 .

Bagaimana dengan 2008-09-50? Beberapa versi PHP menguraikan ini sebagai 20 Oktober 2008 .

Jadi, jika Anda yakin input Anda dalam DD-MM-YYYYformat, lebih baik menggunakan solusi yang ditawarkan oleh @Armin Ronacher .


5
Kekhawatiran valid. Saya kira strtotime () bergantung pada lokal Anda.
Hingga

13
Catatan: di sebagian besar negara yang tidak berbahasa Inggris, formatnya adalah dd-mm-yyyytidak mm-dd-yyyy.
Camilo Martin

1
@CamiloMartin Sebagian besar negara yang berbahasa non-Inggris menggunakan format pertama yang Anda nyatakan tetapi DB biasanya menyimpan tanggal dalam YYYY-mm-ddKonversi hanya terjadi untuk ditampilkan kepada pengguna
Danny22

@DannyG hanya melihat dokumen dan sepertinya Anda benar jika dengan DB yang Anda maksud adalah MySQL. Tapi rasanya konyol untuk melakukan ini ...
Camilo Martin

57


Metode ini bekerja pada kedua Windows dan Unix dan merupakan zona waktu sadar, yang mungkin apa yang Anda inginkan jika Anda bekerja dengan tanggal .

Jika Anda tidak peduli dengan zona waktu, atau ingin menggunakan zona waktu yang digunakan server Anda:

$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 (Ini akan berbeda tergantung pada zona waktu server Anda ...)


Jika Anda ingin menentukan zona waktu mana, di sini EST. (Sama seperti 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


Atau jika Anda ingin menggunakan UTC . (Sama seperti " 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


Apapun, itu selalu merupakan titik awal yang baik untuk menjadi ketat ketika mem-parsing string menjadi data terstruktur. Itu dapat menyimpan debugging yang aneh di masa depan. Karena itu saya sarankan untuk selalu menentukan format tanggal.


Hai Falken, sama-sama. Namun mungkin lebih baik menentukan bahwa solusi ini berlaku untuk PHP 5.3+
Luca Fagioli

43

Menggunakan mktime :

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

Itulah yang selalu saya lakukan. Ledakan pada - atau / atau. atau apa pun itu dipisahkan, maka mktime.
Rich Bradshaw

1
Ada catatan dalam manual PHP untuk parameter terakhir dari fungsi mktime: "Pada PHP 5.1.0, parameter ini menjadi usang. Akibatnya, fitur penanganan zona waktu yang baru harus digunakan sebagai gantinya." Saya belum menemukan fitur-fitur baru apa yang mereka bicarakan, karena mereka belum ditautkan ke sana!
Sangat tidak teratur

Ini jauh lebih baik daripada strtotime()Untuk beberapa alasan strtotime()tidak bekerja pada tanggal tertentu, dan karena itu sangat tidak dapat diandalkan.
dspacejs

17

Menggunakan fungsi strtotime () Anda dapat dengan mudah mengkonversi tanggal ke cap waktu

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

Info lebih lanjut: http://php.net/manual/en/function.strtotime.php

Alat konversi online: http://freeonlinetools24.com/


Bagi pembaca di masa mendatang - strtotime () adalah suatu kecelakaan dan penggunaannya tidak dianjurkan. Ini ambigu, karena mencoba menebak format tanggal. Bahkan jika Anda menggunakannya dengan benar, itu membuat kode Anda lebih sulit untuk dipahami dan dijadikan alasan dan Anda berisiko mengambil perubahan yang dilakukan pada basis kode Anda yang akan menimbulkan kesalahan, karena apa pun yang Anda berikan pada strtotime (), itu akan membuat lebih baik menebak. Tebakan itu mungkin salah, tetapi Anda tidak akan mendapatkan indikasi tebakan itu salah. Itu sebuah pistol. Gunakan jika Anda suka, tetapi pengguna pemula dapat menggunakan peringatan saya pikir. Perhatian: melangkah maju
kontrak Prof Falken dilanggar

12

Berikut ini adalah solusi yang sangat sederhana dan efektif menggunakan splitdan mtimefungsi:

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

Itu bekerja seperti pesona bagi saya.


Perhatikan bahwa split () sekarang tidak digunakan lagi, tetapi jika Anda menggunakan versi php ol, ini berfungsi dengan baik!
Hugo H

6

Mengingat bahwa fungsi strptime()ini tidak berfungsi untuk Windows dan strtotime()dapat mengembalikan hasil yang tidak terduga, saya sarankan menggunakan 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
Catatan: dengan strtotime (): pemisah adalah garis miring (/), maka m / d / y Amerika diasumsikan; sedangkan jika pemisah adalah tanda hubung (-) atau titik (.), maka format dmy Eropa diasumsikan. Jadi saya pikir tidak perlu menggunakan strptime ()
secretlm

6

Jika Anda ingin tahu pasti apakah suatu tanggal diuraikan menjadi sesuatu yang Anda harapkan, Anda dapat menggunakan 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

Jelas dalam kasus ini, tetapi mis. 03-04-2008Bisa 3 April atau 4 Maret tergantung dari mana Anda berasal :)


1
DateTime::createFromFormat mengembalikan falsekesalahan , tidak null.
buka

5

Jika Anda tahu penggunaan format strptimekarena strtotimetidak menebak untuk format, yang mungkin tidak selalu benar. Karena strptimetidak diterapkan di Windows ada fungsi khusus

Ingat bahwa nilai baliknya tm_yearadalah mulai tahun 1900! dan tm_month0-11

Contoh:

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

Jika Anda mau, letakkan di stempel waktu tipe input MySQL . Di atas berfungsi dengan baik (hanya dalam PHP 5 atau lebih baru):

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

3

Inilah cara saya melakukannya:

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

Dengan cara ini, Anda memberi tahu fungsi format tanggal apa yang Anda gunakan dan bahkan menentukan zona waktu.


0

Harap berhati-hati tentang waktu / zona jika Anda mengaturnya untuk menyimpan tanggal dalam database, karena saya mendapat masalah ketika saya membandingkan tanggal dari mysql yang dikonversi menjadi timestampmenggunakan strtotime. Anda harus menggunakan waktu / zona yang sama persis sebelum mengonversi tanggal ke stempel waktu, jika tidak, strtotime () akan menggunakan zona waktu server default.

Silakan lihat contoh ini: 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

Jika Anda ingin mengonversi datetime UTC ( 2016-02-14T12:24:48.321Z) ke timestamp, berikut ini cara melakukannya:

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.