Bagaimana cara mengubah tanggal ke cap waktu di PHP?

350

Bagaimana saya mendapatkan cap waktu dari mis 22-09-2008?

Wizard4U
sumber

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.

Owen
sumber
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);
Armin Ronacher
sumber
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.

Gordon
sumber
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 .

daremon
sumber
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.

Kontrak Prof. Falken dilanggar
sumber
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);
Sampai
sumber
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/

klit67
sumber
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.

Victor Bojica
sumber
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']);
Pemenang
sumber
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 :)

Mendongkrak
sumber
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)
blavla
sumber
4
$time = '22-09-2008';
echo strtotime($time);
Praveen Srinivasan
sumber
4

Gunakan fungsi PHP strtotime()

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

date - Memformat waktu / tanggal lokal

Gurpreet Singh
sumber
katanya, tanggal untuk cap waktu, bukan waktu untuk tanggal
Samuel Petrosyan
Periksa ini sekarang.
Gurpreet Singh
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
Phil Jackson
sumber
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') ?>
lambang
sumber
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.

Julijan Anđelić
sumber
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)
Akam
sumber
-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);
Bukit Obinwanne
sumber