แปลงรูปแบบวันที่ใน PHP


489

ฉันพยายามแปลงวันที่yyyy-mm-ddเป็นdd-mm-yyyy(แต่ไม่ใช่ใน SQL); แต่ฉันไม่ทราบว่าฟังก์ชั่นวันที่ต้องการการประทับเวลาและฉันไม่สามารถรับการประทับเวลาจากสายนี้

เป็นไปได้อย่างไร?


21
dd-mm-yyyy เป็นรูปแบบมาตรฐานใน (ส่วนใหญ่) ยุโรปอย่างน้อยเมื่อคุณต้องการนำเสนอข้อมูลให้กับผู้ใช้
Matteo Riva

7
dd-mm-yyyy ในออสเตรเลียและนิวซีแลนด์เช่นกัน
Jonathan Day

2
mm-dd-yyyy ในสหรัฐอเมริกา @stesch: อดีตเป็นมาตรฐานใน SQL ฉันไม่แน่ใจว่าเป็นมาตรฐานในประเทศใด ๆ :)
เฮอร์เบิร์ต

10
ที่จริงมาตรฐานคือ YYYY-MM-DD เป็นไปตามมาตรฐาน ISO 8601
Jezen Thomas

7
"มาตรฐาน" ทั่วโลกคือ yyyy-mm-dd และควรใช้โดยระบบทุกครั้งที่ทำได้ คำสั่งวันเดือนปีที่ใช้โดยคนส่วนใหญ่ของโลก (ยกเว้นสหรัฐอเมริกา) แต่มักจะมีเครื่องหมายทับไม่ใช่ยัติภังค์ เพื่อหลีกเลี่ยงความสับสนฉันแยก YYYY-MM-DD ด้วยเครื่องหมายยัติภังค์เท่านั้น รูปแบบวันที่อื่นฉันจะแยกด้วยเครื่องหมายทับ สิ่งนี้ทำให้สิ่งที่สอดคล้องกัน
rjmunro

คำตอบ:


1055

ใช้strtotime()และdate():

$originalDate = "2010-03-21";
$newDate = date("d-m-Y", strtotime($originalDate));

(ดูstrtotimeและเอกสารวันที่ในเว็บไซต์ PHP)

โปรดทราบว่านี่เป็นวิธีแก้ปัญหาอย่างรวดเร็วสำหรับคำถามเดิม สำหรับการแปลงที่ครอบคลุมมากขึ้นคุณควรใช้DateTimeคลาสเพื่อแยกวิเคราะห์และจัดรูปแบบ :-)


14
ถ้าฉันได้รับวันที่ 0000-00-00 จาก mySQL มันส่งคืนวันที่ผิดเช่น 31/12/1969 ...
Enrique

3
@Eririque: ถ้าคุณได้รับ 000-00-00 จาก MySQL คุณควรทดสอบกับ FIRST ก่อนที่จะทำการแปลง Simples
ShadowStorm

1
@SobinAugustine และ al: strtotime () จะแปลงสตริงวันที่เป็น "Unix timestamp (จำนวนวินาทีตั้งแต่ 1 มกราคม 1970 00:00:00 UTC)" รูปแบบวันที่ () สามารถเข้าใจแล้วแปลงจาก ดังนั้นสิ่งนี้จะไม่ทำงานกับการประทับเวลาก่อนปี 1970
ซามูเอล Lindblom

1
@SamuelLindblom ไม่ไม่มันจะทำงานก่อนปี 1970
Sobin Augustine

1
@SobinAugustine: คุณพูดถูก อย่างไรก็ตามมันจะไม่ทำงานก่อนปี 1901-12-14 ดังนั้นจึงยังคงมีผลกับวันที่ที่ระบุไว้ข้างต้นไม่ทำงาน
ซามูเอล Lindblom

271

หากคุณต้องการหลีกเลี่ยงการแปลง strtotime (เช่น strtotime จะไม่สามารถแยกวิเคราะห์อินพุตของคุณ) คุณสามารถใช้

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('d-m-Y');

หรือเทียบเท่า:

$newDateString = date_format(date_create_from_format('Y-m-d', $dateString), 'd-m-Y');

คุณให้รูปแบบเป็น $ dateString ก่อนจากนั้นคุณจะบอกรูปแบบที่คุณต้องการให้ $ newDateString อยู่

หรือถ้ารูปแบบต้นฉบับคือ "Ymd" (yyyy-mm-dd) ดังนั้นให้ใช้DateTime :

<?php
    $source = '2012-07-31';
    $date = new DateTime($source);
    echo $date->format('d.m.Y'); // 31.07.2012
    echo $date->format('d-m-Y'); // 31-07-2012
?>

17
ขอบคุณสำหรับDateTime::createFromFormat()- มันมีประโยชน์มากกว่าstrtotime()
Gtx

2
NB: PHP 5.3+ จำเป็นสำหรับสองวิธีแรก
Salman von Abbas

ขอบคุณสำหรับตัวเลือก DateTime ใหม่ มันใช้งานได้และเป็นตัวเลือกที่สะอาดมาก
Nina Morena

1
strtotime()มีประโยชน์สำหรับการแปลงรูปแบบประเภทที่แท้จริง (Ymd) เป็นรูปแบบอื่น ๆ แต่DateTime::createFromFormat()เป็นสากล มันเหมือนSTR_TO_DATEใน MySQL
Taron Saribekyan

อันนี้ใช้งานได้จริงสำหรับฉันแทน Bullshitstrtotime()
Code Cooker

72

ใช้:

implode('-', array_reverse(explode('-', $date)));

หากไม่มีค่าใช้จ่ายในการแปลงวันที่ฉันไม่แน่ใจว่าจะมีความสำคัญมาก


ใช่คำตอบในขณะที่คุณส่งของคุณฉันเชื่อว่า แน่นอนการตรวจสอบข้อผิดพลาดที่พบใน strtotime อาจเป็นสิ่งที่มีประโยชน์
Tim Lytle

2
มีประโยชน์สำหรับฉันในการแปลงรูปแบบวันที่ที่ไม่ใช่แบบอเมริกัน ... dd-mm-yyyy => yyyy-mm-dd ดูphp.net/manual/en/datetime.formats.date.php
Chris Jacob

5
ไม่เข้าใจว่าทำไมคำตอบนี้จึงมีคะแนนน้อย มันควรจะเป็นคำตอบที่ได้รับคะแนนสูงสุด มันแก้ปัญหาได้อย่างง่ายดายและรวดเร็วโดยไม่มีปัญหาใด ๆ ขอบคุณ
Naeem Ul Wahhab

2
คุณสามารถเรียกได้อีกครั้งหากคุณต้องการย้อนกลับรูปแบบวันที่กลับเป็นรูปแบบดั้งเดิม คำตอบที่ดีที่สุดแน่นอน :)
Pedro Araujo Jorge

1
สิ่งนี้ควรเปลี่ยนเป็นคำตอบที่ยอมรับได้ซึ่งแก้ไขปัญหาวันที่และเวลาของการใช้รูปแบบวันที่และวันที่
มัตเตโอโบนินี 'ผู้กดขี่'

38
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

รหัสนี้ใช้ได้กับทุกรูปแบบวันที่

คุณสามารถเปลี่ยนลำดับของตัวแปรทดแทนเช่น $ 3- $ 1- $ 2 เนื่องจากรูปแบบวันที่เก่าของคุณ


ขอบคุณมาก!
LêVănChiến

28
$timestamp = strtotime(your date variable); 
$new_date = date('d-m-Y', $timestamp);

สำหรับข้อมูลเพิ่มเติมโปรดดูที่เอกสารstrtotime

หรือสั้นกว่า:

$new_date = date('d-m-Y', strtotime(your date variable));

27

ความเป็นไปได้อื่นที่ไม่ชัดเจนเช่นกัน:

$oldDate = '2010-03-20'
$arr = explode('-', $oldDate);
$newDate = $arr[2].'-'.$arr[1].'-'.$arr[0];

ฉันไม่รู้ว่าฉันจะใช้ แต่ยัง :)


1
ฉันลงเอยด้วยการใช้สิ่งนี้เพราะในแอปพลิเคชันของเราผู้คนจะป้อน "99" หากไม่ระบุหนึ่งในฟิลด์ (วันเดือนปี) วิธีการที่ดีถ้าคุณมีวันที่ "ปลอม" ในข้อมูลของคุณ
วูดู

18

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

แม้ว่าเอกสารอธิบายฟังก์ชัน strtotime ไม่ดี แต่ @rjmunro ได้แก้ไขปัญหาในความคิดเห็นของเขาอย่างถูกต้อง: มันอยู่ในรูปแบบ ISO วันที่ "YYYY-MM-DD"

นอกจากนี้แม้ว่าฟังก์ชัน Date_Converter ของฉันอาจยังใช้งานได้ แต่ฉันขอเตือนว่าอาจมีข้อความที่ไม่ชัดเจนด้านล่างดังนั้นโปรดอย่าเพิกเฉย

คำตอบที่โหวตมากที่สุดนั้นผิดจริง!

คู่มือ strtotime PHP ที่นี่ระบุว่า "ฟังก์ชันคาดว่าจะได้รับสตริงที่มีรูปแบบวันที่ภาษาอังกฤษ" สิ่งที่จริงหมายถึงคือคาดว่าจะมีรูปแบบวันที่แบบอเมริกันของสหรัฐอเมริกาเช่น "mdY" หรือ "m / d / Y"

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

ฉันเขียนฟังก์ชันเล็กน้อยเพื่อคืนวันที่ในหลายรูปแบบ ใช้และแก้ไขตามประสงค์ หากใครเปลี่ยนเป็นห้องเรียนฉันก็ดีใจถ้ามันจะถูกแบ่งปัน

function Date_Converter($date, $locale = "br") {

    # Exception
    if (is_null($date))
        $date = date("m/d/Y H:i:s");

    # Let's go ahead and get a string date in case we've
    # been given a Unix Time Stamp
    if ($locale == "unix")
        $date = date("m/d/Y H:i:s", $date);

    # Separate Date from Time
    $date = explode(" ", $date);

    if ($locale == "br") {
        # Separate d/m/Y from Date
        $date[0] = explode("/", $date[0]);
        # Rearrange Date into m/d/Y
        $date[0] = $date[0][1] . "/" . $date[0][0] . "/" . $date[0][2];
    }

    # Return date in all formats
        # US
        $Return["datetime"]["us"] = implode(" ", $date);
        $Return["date"]["us"]     = $date[0];

        # Universal
        $Return["time"]           = $date[1];
        $Return["unix_datetime"]  = strtotime($Return["datetime"]["us"]);
        $Return["unix_date"]      = strtotime($Return["date"]["us"]);
        $Return["getdate"]        = getdate($Return["unix_datetime"]);

        # BR
        $Return["datetime"]["br"] = date("d/m/Y H:i:s", $Return["unix_datetime"]);
        $Return["date"]["br"]     = date("d/m/Y", $Return["unix_date"]);

    # Return
    return $Return;

} # End Function

2
อ่านต่อฉันชอบ Ceiroa แก้ไข นั่นเป็นวิธีที่ง่ายกว่าการระเบิด / ฝังวันที่
Igor Donin

3
คำตอบด้านบนไม่ถูกต้อง PHP ทำสิ่งที่ถูกต้องด้วยวันที่จัดรูปแบบ ISO "YYYY-MM-DD" ไม่สามารถตีความมันเป็นวันที่ในสหรัฐอเมริกาได้เนื่องจากมีตัวเลข 4 หลักในตอนเริ่มต้นและใช้ - ไม่ใช่ / เป็นตัวคั่น วันที่ ISO ได้รับการออกแบบอย่างระมัดระวังเพื่อไม่ให้สับสนกับรูปแบบอื่น ๆ
rjmunro



8

ใช้ฟังก์ชันนี้เพื่อแปลงจากรูปแบบใด ๆ เป็นรูปแบบใด ๆ

function reformatDate($date, $from_format = 'd/m/Y', $to_format = 'Y-m-d') {
    $date_aux = date_create_from_format($from_format, $date);
    return date_format($date_aux,$to_format);
}

7

รับด้านล่างเป็นโค้ด PHP ในการสร้างวันพรุ่งนี้โดยใช้mktime()และเปลี่ยนรูปแบบในการวัน / เดือน / ปปปปechoรูปแบบแล้วพิมพ์โดยใช้

$tomorrow = mktime(0, 0, 0, date("m"), date("d") + 1, date("Y"));
echo date("d", $tomorrow) . "/" . date("m", $tomorrow). "/" . date("Y", $tomorrow);


2

คุณสามารถเปลี่ยนรูปแบบโดยใช้วันที่ () และ strtotime ()

$ date = '9/18/2019';

echo date ('dm-y', strtotime ($ date));

ผลลัพธ์:

18-09-19

เราสามารถเปลี่ยนรูปแบบโดยการเปลี่ยน (dmy)


1

สำหรับการแปลงเฉพาะนี้เรายังสามารถใช้สตริงรูปแบบ

$new = vsprintf('%3$s-%2$s-%1$s', explode('-', $old));

เห็นได้ชัดว่าวิธีนี้ใช้ไม่ได้กับการแปลงรูปแบบวันที่อื่น ๆ แต่เนื่องจากเราเพิ่งจัดเรียงสตริงย่อยใหม่ในกรณีนี้จึงเป็นวิธีที่เป็นไปได้อีกวิธีหนึ่ง


วิธีการแปลง 2019-10-28T17: 02: 49Z ถึง timestamp?
Bogdan Bogdanov


1
    function dateFormat($date) {
        $m = preg_replace('/[^0-9]/', '', $date);
        if (preg_match_all('/\d{2}+/', $m, $r)) {
        $r = reset($r);
            if ($r[2] <= 12 && $r[3] <= 31) return "$r[0]$r[1]-$r[2]-$r[3]";// Y-m-d
            if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$r[2]$r[3]-$r[1]-$r[0]";// d-m-Y
            if ($r[0] <= 12 && $r[1] <= 31) return "$r[2]$r[3]-$r[0]-$r[1]";// m-d-Y
            if ($r[2] <= 31 && $r[3] <= 12) return "$r[0]$r[1]-$r[3]-$r[2]";//Y-m-d
        }
    }

var_dump(dateFormat('31/01/2000')); // return 2000-01-31
var_dump(dateFormat('01-31-2000')); // return 2000-01-31
var_dump(dateFormat('2000-31-01')); // return 2000-01-31
var_dump(dateFormat('20003101')); // return 2000-01-31

0

ใช้วิธีง่าย ๆstrtotime()และdate():

$original_dateTime = "2019-05-11 17:02:07"; #This may be database datetime
$newDate = date("d-m-Y", strtotime($original_dateTime));

กับเวลา

$newDate = date("d-m-Y h:i:s a", strtotime($original_dateTime));

0

ใช้date_createและdate_format

ลองสิ่งนี้

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.