Strtotime () gg / aa / YYYY biçiminde çalışmaz


167

strtotime()İşlevi gerçekten seviyorum , ancak kullanım kılavuzu desteklenen tarih biçimlerinin tam bir açıklamasını vermiyor. strtotime('dd/mm/YYYY')çalışmıyor, sadece mm/dd/YYYYformatta çalışıyor .

Tarih dd/mm/YYYYbiçimim varsa, bunu nasıl dönüştürebilirim YYYY-mm-dd? explode()Fonksiyonu kullanarak yapabilirim , ama daha iyi çözümler olduğunu düşünüyorum.


7
Ayrıştırmak için aslında "YYYY-aa-gg" biçimine dönüştürmeniz gerekmez - sadece "gg-aa-YYYY" olarak değiştirmeniz gerekirstr_replace('/', '-', $date);
Gavin Coates

Yanıtlar:


399

İşte basitleştirilmiş çözüm:

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

Sonuç:

2010-05-25

strtotimeDokümantasyon okur:

Tarihler, M / d / y ya da GAY biçimleri, çeşitli bileşenler arasındaki ayırıcı bakılarak belirgin hale edilir: ayırıcı bir çizgi ise, ( / ), daha sonra Amerikan m / d / y varsayılır; ayırıcı bir çizgi ( - ) veya nokta ( . ) ise, Avrupa dmy formatı varsayılır.


2
@Web Logic strtotime () işlevinin varsayılan biçimini anlayamıyorum ve strtotimr ('01 -01-2010 ') yazarsam dd-mm-YYYY veya mm-dd-YYYY biçimi olarak anlar mı?
Simon

3
Eğer ile test ederseniz: echo date('Y-m-l', strtotime('01-01-2010'));Sonuç 2010-01-Friday. Bu nedenle, sondaki gün, dateişleve tarih biçimini nasıl belirlediğinize bağlıdır .

1
Burada yazdıklarınız doğruysa ve kullanıcıların sorusunu yanıtlıyor olsa da - asıl sorunu çözmenin dolambaçlı bir yoludur. Strtotime () işlevinin bir tarihi "gg / aa / yy" biçiminde düzgün ayrıştırması için, "/" yerine "-" ifadesini değiştirmeniz gerekir. Bu nedenle, cevabın sadece ilk iki satırına ihtiyacınız vardır: $date = '25/05/2010'; $date = str_replace('/', '-', $date); Sorununuzu çözmek için ek satır gerekli değildir.
Gavin Coates

Bu sadece gün> 12 ise doğrudur: $ date = '1/2/34'; // Şubat 2034 eko tarihinin 1'i ('d M Y', strtotime ($ date)); // 02 Ocak 2034
kurdtpage

Teşekkürler dostum. Gerçekten benim günümü yaptı.
BEingprabhU

64

DateTime :: createFromFormat ile tarihleri ​​özel bir biçimden (PHP 5.3'ten itibaren) ayrıştırabilirsiniz

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(Kenara: !Belirtilmemiş değerleri Unix zaman damgasına sıfırlamak için kullanılır, yani saat gece yarısı olacaktır.)


PHP 5.3'ü kullanmak istemiyorsanız (veya kullanamıyorsanız), strtotime'ın kabul ettiği kullanılabilir tarih / saat biçimlerinin tam listesi Tarih Biçimleri kılavuz sayfasında listelenir . Bu sayfa m/d/Y, üzerinde anlaşılan gerçeği daha ayrıntılı olarak açıklamaktadır d/m/Y(ancak, buradaki cevaplarda belirtildiği gibi d-m-Y, d.m.Yveya kullanabilirsiniz d\tm\tY).


Geçmişte, str_replacebaşka bir cevapta belirtilen soruna da başvurdum ve tarih dizesini kendi biçimine benzetiyorum

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);

17

Bu birçok soruna iyi bir çözümdür:

function datetotime ($date, $format = 'YYYY-MM-DD') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);

    return mktime(0, 0, 0, $month, $day, $year);

}

16

STRTOTIME yazmasından Not:

M / d / y veya dmy formatlarındaki tarihler, çeşitli bileşenler arasındaki ayırıcıya bakılarak belirsizleştirilir: ayırıcı bir eğik çizgi (/) ise, Amerikan m / d / y olduğu varsayılır; ayırıcı bir tire (-) veya nokta (.) ise, Avrupa dmy formatı varsayılır.

Bu kadar basit.


Bunu hata vermeyecek, ancak kontrol ettiğim $tve $t1farklı sonuçlar gösterdiğim için uygulayabiliriz . Ben böyle kontrol ettim. $t=strtotime(date('d-m-Y'));ve $t1=strtotime(date('m/d/Y'));
vusan

3

en hızlı muhtemelen olmalı

false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))

biçim doğru görünmüyorsa bu false değerini döndürür, ancak tarihin geçerli olup olmadığını kontrol etmez


2

Daha iyi bir çözüm bulamadım. Sen kullanabilirsiniz explode(), preg_match_all()vb

Böyle statik bir yardımcı fonksiyonum var

class Date {

    public static function ausStrToTime($str) {
        $dateTokens = explode('/', $str);
        return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 

    }

}

Muhtemelen bunun için daha iyi bir isim var, ama kullanıyorum ausStrToTime()çünkü Avustralya tarihleriyle (genellikle uğraştığım, bir Avustralya olduğum) çalışıyor. Daha iyi bir isim muhtemelen standart isim olabilir, ama bunun ne olduğundan emin değilim.


2

DDmmyy biçimini biçime dönüştürmeye çalıştım date("Y-m-d"ama doğrudan geçtiğimde çalışmadıddmmyy =date('dmy')

sonra yyyy-aa-gg formatında olması gerektiğini fark etti. düzenlemek için kullanılan alt dize

$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  

sonra geçti date("Y-m-d",strtotime($strParam));

işe yaradı!


2

$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

Bu senin için işe yarayacak. Dizeyi, Dizeye verilen orijinal biçiminin ne olduğunu PHP'ye belirtebileceğiniz özel bir tarih biçimine dönüştürürsünüz. Artık bir tarih biçimi olduğundan, PHP'nin MySQL tarafından kullanılanla aynı olan varsayılan tarih biçimine dönüştürebilirsiniz.


en temiz ve en iyi çözüm
Marco Marsala

1

Bu değeri bir veritabanından mı alıyorsunuz? Öyleyse, veritabanında biçimlendirmeyi düşünün ( date_formatörneğin mysql içinde kullanın ). Değilse, değeri patlatmak en iyi bahis olabilir, çünkü strtotime sadece gg / aa / yyyy değerlerini takdir etmiyor gibi görünüyor.


1

Gg / aa / YYYY'de olduğunu biliyorsanız, şunları yapabilirsiniz:

    $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
    $match = array();
    if (preg_match($regex, $date, $match)) {
        if (strlen($match[3]) == 2) {
            $match[3] = '20' . $match[3];
        }
        return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
    }
    return strtotime($date);

Tarihleri, d / m / YY veya gg / aa / YYYY (veya ikisinin herhangi bir kombinasyonu) biçiminde eşleşir ...

Sadece / öğesinden daha fazla ayırıcıyı desteklemek istiyorsanız, normal ifadeyi şu şekilde değiştirebilirsiniz:

    $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';

Ve sonra [/-]bit içine istediğiniz karakterleri ekleyin (Not, - karakterinin son olması gerekir)


Şüphesiz senin regex kullanarak olmalıdır \dondalık basamak için yerine [/d]için ileriye eğik çizgi veya d karakteri .
11'de salat

1

Bu geçici çözüm, patlatmaktan daha basit ve daha zariftir:

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

Tarihi hangi formatta aldığınızı bilmek zorunda değilsiniz, ancak eğik çizgilerle gelirse bunların yerine tam duraklar gelir ve strtotime tarafından Avrupa olarak kabul edilir.


0

En basit çözüm şudur:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));

3
Bu yanlış. Soru açıkça gg / aa / yyyy girdileri ile ilgilidir.
Matt Fletcher

0

Bu, önde gelen sıfır olsa bile kullanıyorum.

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>

0

$ date_info = '20 / 02/2019 '; yankı tarihi ('Ym-d', strtotime (str_replace ('/', '-', $ date_info)));


0

Bu kadar basit

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
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.