PHP'de zaman damgasına tarih nasıl dönüştürülür?


Yanıtlar:


612


Bu yöntem üzerinde çalışır hem Windows ve Unix ve bir saat dilimi Üzerinde çalışmak eğer ne istediğinizi muhtemelen olan farkında tarihleri .

Saat dilimi ile ilgilenmiyorsanız veya sunucunuzun kullandığı saat dilimini kullanmak istiyorsanız:

$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 (Bu, sunucu saat diliminize bağlı olarak değişir ...)


Hangi saat diliminde belirtmek isterseniz, burada EST. (New York ile aynı.)

$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


Veya UTC'yi kullanmak istiyorsanız . (" GMT " ile aynı .)

$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


Ne olursa olsun, dizeleri yapılandırılmış verilere ayrıştırırken katı olmak her zaman iyi bir başlangıç ​​noktasıdır. Gelecekte garip hata ayıklamayı kurtarabilir. Bu nedenle her zaman tarih biçimini belirtmenizi öneririm.


2
Zarif. Bu konuyu unutmuştum!
Till

53
Bu yanıtın kredisini henüz almadınız mı ?!
Mark Tomlin

4
Tamamen geçerli bir cevap, ama Armin Ronacher'in cevabının cevaplarda eşleşmediğine şaşırdım - belirsizlik HER ZAMAN kötü.
RonLugge

1
@Devner Görünüşe göre, sunucumda bu biçim desteklenmiyor. Belki seninkinden farklı.
Lucas

1
Bu çözüm beklenmedik bir davranışa yol açabilir. PHP 5.3+ kullananlar , tarih formatı üzerinde tam kontrole sahip olan Prof. Falken cevabını benimsemelidir .
Luca Fagioli

185

Ayrıca tam olarak bir biçim bekleyen strptime () vardır:

$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_day yerine tm_month ve tm_day yerine tm_mday olmalıdır
amarillion

68
Dikkat edin, strptime işlevi Windows'ta mevcut değildir.
understack

12
Windows ve PHP 5.3.0+ sürümlerinde olanlar date_parse_from_formatyerine kullanmayı düşünün strptime.
Erwin Wessels

1
... çünkü strptimeWindows platformlarında uygulanmadı.
Randell

Bu yüksek oy alan bir yanıt olduğundan, Windows için PHP'nin yanı sıra unixen üzerinde çalışan bir yanıta düzenlemeyi düşünür müsünüz? Ve IMHO ideal olarak zaman dilimlerinden bahsetmelidir.
Prof. Falken sözleşmesi

126

İle DateTimeAPI :

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

// or 

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

Prosedürel API ile aynı:

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

// or

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

Desteklenmeyen bir biçim kullandığınız için yukarıdaki işlem başarısız olursa ,

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

Eğer ayarlamazsanız, !zaman bölümünün geçerli saate ayarlanacağını unutmayın; bu, saati atladığınızda gece yarısını kullanacak ilk dört saatten farklıdır.

Yine başka bir alternatif IntlDateFormatterAPI kullanmaktır :

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

Yerelleştirilmiş tarih dizeleriyle çalışmadığınız sürece, daha kolay seçim büyük olasılıkla DateTime olur.


15
Bunu bugünlerde cevabım üzerine tavsiye ederim.
Till

Arggg. ! Unutma ! DateTime yardımsever sorarak veya söylenmeden geçerli zamanı ekleyerek çünkü - My tarih bazlı damgası her tazelede değişen ve deli beni kullanıyordu. Grrr.

Belirsiz tarih ayrıştırmasına karşı önerdiğimi ve tarih dizelerini ayrıştırırken tarih biçiminin açıkça verilmesi gerektiğini eklemek istiyorum.
Prof. Falken sözleşmesi

114

Bunun gibi işlevlere dikkat edin, strtotime()ne demek istediğinizi "tahmin etmeye" çalışın (elbette tahmin etmiyor, kurallar burada ).

Gerçekten de tek makul şey olduğu için 22 Eylül 200822-09-2008 olarak ayrıştırılacaktır .

Nasıl 08-09-2008ayrıştırılacak? Muhtemelen 09 Ağustos 2008 .

Ne olmuş 2008-09-50? PHP'nin bazı sürümleri bunu 20 Ekim 2008 olarak ayrıştırmaktadır .

Dolayısıyla, girdinizinDD-MM-YYYY formatta olduğundan eminseniz, @Armin Ronacher tarafından sunulan çözümü kullanmak daha iyidir .


5
Geçerli endişe. Sanırım strtotime () yerel ayarınıza bağlıdır.
Till

13
Not: İngilizce bilmeyen çoğu ülkede, biçim dd-mm-yyyydeğildir mm-dd-yyyy.
Camilo Martin

1
@CamiloMartin Çoğu İngilizce konuşulmayan ülke belirttiğiniz ilk biçimi kullanır, ancak DB genellikle tarihi depolar YYYY-mm-dd. Dönüşüm yalnızca kullanıcılara gösterilir
Danny22

@DannyG sadece dokümanlara baktı ve DB tarafından MySQL demek istiyorsan haklısın. Ama bunu yapmak gülünç görünüyor ...
Camilo Martin

57


Bu yöntem üzerinde çalışır hem Windows ve Unix ve bir saat dilimi Üzerinde çalışmak eğer ne istediğinizi muhtemelen olan farkında tarihleri .

Saat dilimi ile ilgilenmiyorsanız veya sunucunuzun kullandığı saat dilimini kullanmak istiyorsanız:

$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 (Bu, sunucu saat diliminize bağlı olarak değişir ...)


Hangi saat diliminde belirtmek isterseniz, burada EST. (New York ile aynı.)

$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


Veya UTC'yi kullanmak istiyorsanız . (" GMT " ile aynı .)

$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


Ne olursa olsun, dizeleri yapılandırılmış verilere ayrıştırırken katı olmak her zaman iyi bir başlangıç ​​noktasıdır. Gelecekte garip hata ayıklamayı kurtarabilir. Bu nedenle her zaman tarih biçimini belirtmenizi öneririm.


Hey Falken, rica ederim. Ancak muhtemelen bu çözümün PHP 5.3+ için geçerli olduğunu belirtmek daha iyidir
Luca Fagioli

43

Mktime kullanarak :

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

Hep böyle yaptım. - veya / veya üzerine patlatın. veya ne olursa olsun, o zaman mktime.
Rich Bradshaw

1
PHP el kitabında mktime işlevinin son parametresi için bir not vardır: "PHP 5.1.0'dan itibaren bu parametre kullanımdan kaldırıldı. Sonuç olarak, bunun yerine yeni saat dilimi işleme özellikleri kullanılmalıdır." Henüz bağlantı kurmadıkları için yeni özelliklerin ne hakkında konuştuklarını henüz keşfetmedim!
Son derece Düzensiz

Bu çok daha iyidir strtotime()Bazı nedenlerden dolayı strtotime()belirli tarihlerde çalışmaz ve bu nedenle çok güvenilmezdir.
dspacejs

17

Strtotime () işlevini kullanarak tarihi kolayca zaman damgasına dönüştürebilirsiniz

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

Daha fazla bilgi: http://php.net/manual/en/function.strtotime.php

Çevrimiçi dönüşüm aracı: http://freeonlinetools24.com/


Gelecekteki okuyuculara - strtotime () bir kazaydı ve kullanımı teşvik edilmemelidir. Bu belirsiz, çünkü tarih biçimini tahmin etmeye çalışıyor. Doğru kullansanız bile, kodunuzun anlaşılmasını ve nedenini zorlaştırır ve kod tabanınızda hata tanıtacak bir değişiklik yapma riskini taşırsınız, çünkü strtotime () 'a ne verirseniz verin, tahmin etmek en iyisidir. Bu tahmin yanlış olabilir, ancak yanlış tahmin ettiğine dair hiçbir belirti almazsınız. Bir tabanca. İsterseniz kullanın, ancak acemi kullanıcılar bence bir uyarı kullanabilir. Dikkat: önde tabanca
Prof. Falken sözleşmesi

12

İşte splitve mtimefonksiyonlarını kullanan çok basit ve etkili bir çözüm :

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

Benim için bir cazibe gibi çalıştı.


Split () işlevinin artık kullanımdan kaldırıldığını unutmayın, ancak ol 'php sürümü kullanıyorsanız, harika çalışıyor!
Hugo H

6

İşlevin strptime()Windows için çalışmadığı ve strtotime()beklenmedik sonuçlar döndürebileceği göz önüne alındığında, şunları kullanmanızı öneririz 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
Not: strtotime () ile: ayırıcı bir eğik çizgi (/), o zaman Amerikan m / d / y olduğu varsayılır; ayırıcı bir çizgi (-) veya nokta (.) ise, Avrupa dmy formatı varsayılır. Bu yüzden strptime () kullanmanıza gerek olmadığını düşünüyorum
secretlm

6

Bir tarihin beklediğiniz bir şeye ayrıştırılıp ayrıştırılmadığından emin olmak için şunu kullanabilirsiniz 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

Bu durumda açıktır, ancak 03-04-2008nereden geldiğinize bağlı olarak 3 Nisan veya 4 Mart olabilir :)


1
DateTime::createFromFormat falsehata ile döner , değil null.
mpen

5

Eğer biçimini biliyorsanız, strptimeçünkü strtotimeher zaman doğru olmayabilir biçimi için bir tahmin yapar. Yana strptimeWindows uygulanmadı özel fonksiyonu vardır

Geri dönüş tm_yeardeğerinin 1900 olduğunu unutmayın ! ve tm_month0-11

Misal:

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

İsterseniz, MySQL giriş türü zaman damgasına koyun . Yukarıdakiler çok iyi çalışır (sadece PHP 5 veya sonraki sürümlerde):

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

3

İşte nasıl yaparım:

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

Bu şekilde, hangi tarih biçimini kullandığınızı işleve bildirir ve hatta saat dilimini belirtirsiniz.


0

timestampKullanmaya dönüştürülen mysql'den tarihleri ​​karşılaştırdığımda bir sorun yaşadığım için, veritabanında tarihleri ​​kaydetmek için ayarlarsanız saat / bölge konusunda dikkatli olun.strtotime . tarihi zaman damgasına dönüştürmeden önce tam olarak aynı saat / bölgeyi kullanmanız gerekir, aksi takdirde strtotime () varsayılan sunucu saat dilimini kullanır.

Lütfen bu örneğe bakın: 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

Bir UTC datetime ( 2016-02-14T12:24:48.321Z) öğesini zaman damgasına dönüştürmek istiyorsanız, bunu şu şekilde yapabilirsiniz:

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.