Strtotime () ไม่ทำงานกับรูปแบบ dd / mm / YYYY


167

ฉันชอบstrtotime()ฟังก์ชั่นนี้มาก แต่คู่มือผู้ใช้ไม่ได้ให้คำอธิบายที่สมบูรณ์เกี่ยวกับรูปแบบวันที่ที่รองรับ strtotime('dd/mm/YYYY')ใช้งานไม่ได้กับmm/dd/YYYYรูปแบบเท่านั้น

หากฉันมีdd/mm/YYYYรูปแบบวันที่ฉันจะแปลงเป็นYYYY-mm-ddอย่างไร ฉันสามารถทำได้โดยใช้explode()ฟังก์ชั่น แต่ฉันคิดว่ามีวิธีแก้ปัญหาที่ดีกว่า


7
คุณไม่จำเป็นต้องแปลงเป็นรูปแบบ "YYYY-mm-dd" เพื่อแยกมัน - คุณเพียงแค่เปลี่ยนเป็น "dd-mm-YYYY" ซึ่งสามารถทำได้ด้วยstr_replace('/', '-', $date);
Gavin Coates

คำตอบ:


399

นี่คือโซลูชันที่ง่ายขึ้น:

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

ผลลัพธ์:

2010-05-25

strtotimeเอกสารอ่าน:

วันที่ในรูปแบบm / d / yหรือรูปแบบdmyนั้นถูกทำให้คลุมเครือโดยดูที่ตัวคั่นระหว่างส่วนประกอบต่าง ๆ : ถ้าตัวคั่นเป็นเครื่องหมายทับ ( / ) ดังนั้นสันนิษฐานว่าm / d / yของชาวอเมริกัน; ในขณะที่ถ้าตัวคั่นเป็นเส้นประ ( - ) หรือจุด ( . ) ดังนั้นรูปแบบdmy ของยุโรปจะถือว่า


2
@Web Logic ฉันไม่สามารถ andstand รูปแบบเริ่มต้นของฟังก์ชั่น strtotime () ถ้าฉันเขียน strtotimr ('01 -01-2010 ') มันเข้าใจว่าเป็นรูปแบบ dd-mm-YYYY หรือ mm-dd-YYYY
Simon

3
หากคุณทดสอบกับ: ผลที่ได้คือecho date('Y-m-l', strtotime('01-01-2010')); 2010-01-Fridayดังนั้นวันที่มาถึงตอนท้ายจะขึ้นอยู่กับว่าคุณระบุรูปแบบวันที่ในdateฟังก์ชั่นอย่างไร

1
ในขณะที่สิ่งที่คุณโพสต์ไว้ที่นี่นั้นถูกต้องและตอบคำถามของผู้ใช้มันเป็นวิธีการแก้ปัญหาที่เกิดขึ้นจริง เพื่อให้ strtotime () แยกวันที่อย่างถูกต้องในรูปแบบ "dd / mm / yy" คุณจะต้องแทนที่ "/" ด้วย "-" ดังนั้นคุณต้องการเพียงแค่สองบรรทัดแรกของคำตอบ: $date = '25/05/2010'; $date = str_replace('/', '-', $date); บรรทัดเพิ่มเติมไม่จำเป็นในการแก้ปัญหาของคุณ
Gavin Coates

สิ่งนี้ถูกต้องหากวันนั้นคือ> 12: $ date = '1/2/34'; // วันที่ 1 กุมภาพันธ์ 2034 echo date ('d M Y', strtotime ($ date)); // 02 ม.ค. 2034
kurdtpage

ขอบคุณเพื่อน ทำวันของฉันจริงๆ
BEingprabhU

64

คุณสามารถแยกวันที่จากรูปแบบที่กำหนดเอง (ณ PHP 5.3) ด้วยDateTime :: createFromFormat

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

(นอกเหนือจาก: !ใช้เพื่อรีเซ็ตค่าที่ไม่ได้ระบุไว้ในการประทับเวลา Unix เช่นเวลาจะเป็นเที่ยงคืน)


หากคุณไม่ต้องการ (หรือไม่สามารถ) ใช้ PHP 5.3 รายการทั้งหมดของรูปแบบวันที่ / เวลาที่มีซึ่ง strtotime ยอมรับจะแสดงอยู่ในหน้าคู่มือรูปแบบวันที่ หน้าเว็บที่เพิ่มเติมอย่างละเอียดอธิบายความจริงที่ว่าm/d/Yอนุมานได้มากกว่าd/m/Y( แต่คุณสามารถเป็นที่กล่าวถึงในคำตอบที่นี่ใช้d-m-Y, d.m.Yหรือd\tm\tY)


ในอดีตฉันยังใช้ resorted str_replaceกับคำตอบอื่น ๆ เช่นเดียวกับการแยกวิเคราะห์สตริงวันที่ในรูปแบบอื่นเช่น

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

17

นี่เป็นวิธีที่ดีในการแก้ปัญหาต่าง ๆ :

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 หมายเหตุ:

วันที่ในรูปแบบ m / d / y หรือรูปแบบ dmy นั้นถูกทำให้คลุมเครือโดยดูที่ตัวคั่นระหว่างส่วนประกอบต่าง ๆ : ถ้าตัวคั่นเป็นเครื่องหมายทับ (/) ดังนั้นสันนิษฐานว่า m / d / y ของชาวอเมริกัน; ในขณะที่ถ้าตัวคั่นเป็นเส้นประ (-) หรือจุด (.) ดังนั้นรูปแบบ dmy ของยุโรปจะถือว่า

มันเป็นเรื่องง่ายเหมือนที่.


เราสามารถใช้งานได้เนื่องจากพวกเขาจะไม่ให้ข้อผิดพลาด แต่เมื่อฉันตรวจสอบ$tและ$t1แสดงผลลัพธ์ที่แตกต่างกัน ฉันตรวจสอบเช่นนี้ $t=strtotime(date('d-m-Y'));และ $t1=strtotime(date('m/d/Y'));
vusan

3

เร็วที่สุดน่าจะเป็น

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

สิ่งนี้จะคืนค่าเท็จหากรูปแบบดูไม่ถูกต้อง แต่จะไม่ตรวจสอบว่าวันที่นั้นถูกต้องหรือไม่


2

ฉันไม่พบทางออกที่ดีกว่านี้ คุณสามารถใช้explode(), preg_match_all()ฯลฯ

ฉันมีฟังก์ชั่นตัวช่วยแบบคงที่เช่นนี้

class Date {

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

    }

}

อาจมีชื่อที่ดีกว่าสำหรับสิ่งนั้น แต่ฉันใช้ausStrToTime()เพราะทำงานกับวันที่ของออสเตรเลีย (ซึ่งฉันมักจะติดต่อด้วย ชื่อที่ดีกว่าน่าจะเป็นชื่อมาตรฐาน แต่ฉันไม่แน่ใจว่ามันคืออะไร


2

ฉันพยายามแปลงรูปแบบ ddmmyy เป็นรูปdate("Y-m-d"แบบ แต่ไม่ทำงานเมื่อฉันส่งผ่านโดยตรงddmmyy =date('dmy')

จากนั้นตระหนักว่ามันจะต้องอยู่ในรูปแบบ yyyy-mm-dd ดังนั้น ใช้สตริงย่อยเพื่อจัดระเบียบ

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

จากนั้นส่งผ่านไปยัง date("Y-m-d",strtotime($strParam));

มันใช้งานได้!


2

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

สิ่งนี้จะได้ผลสำหรับคุณ คุณแปลงสตริงเป็นรูปแบบวันที่ที่กำหนดเองซึ่งคุณสามารถระบุเป็น PHP ได้ว่ารูปแบบดั้งเดิมของสตริงนั้นคืออะไร ตอนนี้มันเป็นรูปแบบวันที่คุณสามารถแปลงเป็นรูปแบบวันที่เริ่มต้นของ PHP ซึ่งเป็นรูปแบบเดียวกับที่ใช้โดย MySQL


ทางออกที่สะอาดและดีที่สุด
Marco Marsala

1

คุณได้รับค่านี้จากฐานข้อมูลหรือไม่? หากเป็นเช่นนั้นให้ลองจัดรูปแบบในฐานข้อมูล (เช่นใช้date_formatใน mysql เป็นต้น) ถ้าไม่การกระจายค่าอาจเป็นทางออกที่ดีที่สุดเนื่องจาก strtotime ดูเหมือนจะไม่เห็นคุณค่าของ dd / mm / yyyy


1

ถ้าคุณรู้ว่ามันอยู่ใน dd / mm / YYYY คุณสามารถทำได้:

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

มันจะตรงกับวันที่ในรูปแบบ d / m / YY หรือ dd / mm / YYYY (หรือการรวมกันของทั้งสอง) ...

หากคุณต้องการสนับสนุนตัวคั่นมากกว่า / เพียงแค่คุณสามารถเปลี่ยน regex เป็น:

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

จากนั้นเพิ่มอักขระใด ๆ ที่คุณต้องการลงใน[/-]บิต (หมายเหตุ - ตัวอักขระจะต้องเป็นนามสกุลสุดท้าย)


แน่นอน regex ของคุณควรจะใช้\dสำหรับตัวเลขทศนิยมมากกว่า[/d]สำหรับการคาดการณ์ล่วงหน้าเฉือนหรือ d ตัวอักษร
ศาลา

1

วิธีแก้ปัญหานี้ง่ายกว่าและสวยงามกว่าการระเบิด:

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

คุณไม่จำเป็นต้องรู้ว่ารูปแบบที่คุณได้รับวันที่ใน แต่ถ้ามันมาพร้อมกับทับพวกเขาจะถูกแทนที่ด้วยหยุดเต็มและจะถือว่าเป็นยุโรปโดย strtotime


0

ทางออกที่ง่ายที่สุดคือ:

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

3
นี่เป็นสิ่งที่ผิด คำถามเกี่ยวข้องกับอินพุต dd / mm / yyyy อย่างชัดเจน
Matt Fletcher

0

นี่เป็นวิธีแก้ปัญหาที่ฉันใช้แม้ว่าจะมีศูนย์นำหน้าอยู่ก็ตาม

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

 echo $date;
?>


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.