การแปลงสตริงเป็น Date และ DateTime


292

หากฉันมีสตริง PHP ในรูปแบบของmm-dd-YYYY(เช่น 10-16-2003) ฉันจะแปลงให้เป็น a Dateและ a DateTimeในรูปแบบได้YYYY-mm-ddอย่างไร เหตุผลเดียวที่ฉันขอทั้งสองDateและDateTimeเป็นเพราะฉันต้องการหนึ่งในจุดหนึ่งและอื่น ๆ ในจุดที่แตกต่างกัน

คำตอบ:


480

ใช้strtotime()ในวันแรกของคุณจากนั้นdate('Y-m-d')ทำการแปลง:

$time = strtotime('10/16/2003');

$newformat = date('Y-m-d',$time);

echo $newformat;
// 2003-10-16

โปรดทราบว่ามีความแตกต่างระหว่างการใช้เครื่องหมายทับ/ซ้ายและขีดกลาง-ในstrtotime()ฟังก์ชัน อ้างจาก php.net:

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

เพื่อหลีกเลี่ยงความไม่ชัดเจนที่อาจเกิดขึ้นควรใช้วันที่ ISO 8601 (YYYY-MM-DD) หรือ DateTime :: createFromFormat () เมื่อเป็นไปได้


11
สิ่งนี้ใช้ไม่ได้ PHP จะแปลอินพุตนั้นเป็น DD-MM-YYYY
Matthew

ฉันเพิ่มคำอธิบายเพิ่มเติมเล็กน้อยลงในโค้ดของฉันขอบคุณ @konforce
Ibu

9
อ่านคำตอบต่อไปเพื่อหาคำตอบที่ดีกว่า
Manuel Bitto

@delive สตริงวันที่ของคุณน่าจะไม่ใช่วันที่ที่ถูกต้อง
Ibu

8
มันไม่ทำงานเพราะคำตอบนี้ทำให้เข้าใจผิด strtotimeยอมรับรูปแบบที่แน่นอน คุณไม่สามารถให้อาหารอะไร นั่นเป็นเหตุผลที่ควรจะนำมาใช้แทนDateTime::createFromFormat strtotimeน่าเศร้าคำตอบนี้มี upvotes มากเกินไปสำหรับทุกคนที่ให้ความสนใจ มันคือทั้งหมดที่คัดลอกวางวันนี้
NB

432

คุณต้องระวังด้วยรูปแบบ m / d / Y และ mdY PHP พิจารณา/ว่าหมายถึง m / d / Y และ-หมายถึง dmY ฉันจะอธิบายรูปแบบการป้อนข้อมูลอย่างชัดเจนในกรณีนี้:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

ด้วยวิธีนี้คุณไม่ได้อยู่ที่การตีความที่แน่นอน


37
อยากรู้ว่าทำไมคำตอบนี้ไม่ใช่คำตอบที่ยอมรับได้ ... นี่ยืดหยุ่นกว่าการใช้strtotime()ฟังก์ชั่น
jzimmerman2011

9
สิ่งสำคัญคือต้องชี้ให้เห็นว่าคลาสDateTime ของ PHP มีให้ตั้งแต่ PHP เวอร์ชัน 5.2 และcreateFromFormatตั้งแต่ 5.3
Diego Nemo

14
เช่นเดียวกับทุกฟังก์ชั่นคุณควรตรวจสอบว่ามันตรงกับเวอร์ชั่นขั้นต่ำที่คุณต้องสนับสนุนหรือไม่ แต่ PHP 5.2 EOL คือมกราคม 2011 ไม่มีใครควรใช้มันอีกต่อไป การจัดเลี้ยงให้กับผู้คนเหล่านั้นเป็นเพียงการทำให้พวกเขาสามารถเรียกใช้ซอฟต์แวร์ที่ล้าสมัยและไม่ปลอดภัย
แมทธิว

@ Matewew ใช่ถูกต้อง แต่คุณไม่เคยตอนนี้แม้วันนี้ผมพบว่ารุ่น PHP4.1 ยังคงติดตั้ง ...
โรลันด์

29

ในการแยกวิเคราะห์วันที่คุณควรใช้: DateTime :: createFromFormat ();

Ex:

$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");

อย่างไรก็ตามโปรดระวังเพราะอาจทำให้เกิดปัญหากับ:

PHP Fatal error: Call to a member function format() on a non-object 

คุณต้องตรวจสอบว่าการจัดรูปแบบเป็นไปได้จริงก่อน:

$dateDE = "16/10/2013";
$dateObj = \DateTime::createFromFormat("d.m.Y", $dateDE);
if (!$dateObj)
{
    throw new \UnexpectedValueException("Could not parse the date: $date");
}
$dateUS = $dateObj->format("m/d/Y");

ตอนนี้แทนที่จะล้มเหลวคุณจะได้รับการยกเว้นซึ่งคุณสามารถจับเผยแพร่และอื่น ๆ

$ dateDE มีรูปแบบที่ไม่ถูกต้องควรเป็น "16.10.2013";


โปรดสังเกตว่าการตรวจสอบ $ dateObj ด้วยวิธีนั้นจะทำให้มั่นใจได้ว่ารูปแบบนั้นตรงกับรูปแบบไม่ใช่ว่าวันที่นั้นจะถูกต้องจริง ตัวอย่างเช่นวันที่ 99/99/2010 จะผ่านการตรวจสอบนี้เนื่องจากตรงกับ m / d / Y แต่ไม่ใช่วันที่คุณต้องการอนุญาต คำตอบนี้กล่าวถึงสถานการณ์นี้ -> stackoverflow.com/a/10120725/995014
Kilian Perdomo Curbelo

22
$d = new DateTime('10-16-2003');

$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16

แก้ไข: คุณยังสามารถส่งตัวสร้าง DateTimeZone ไปยัง DateTime () เพื่อให้แน่ใจว่าการสร้างวันที่สำหรับเขตเวลาที่ต้องการไม่ใช่ค่าเริ่มต้นของเซิร์ฟเวอร์


6
ฉันเชื่อว่าสิ่งนี้จะทำให้เกิดข้อยกเว้นเนื่องจากเดือน 16 ไม่ถูกต้อง
Matthew

สิ่งสำคัญคือต้องชี้ให้เห็นว่าคลาสDateTime ของ PHP มีให้ตั้งแต่ PHP เวอร์ชัน 5.2 และgetTimestampตั้งแต่ 5.3
Diego Nemo

2

สำหรับวันแรก

$_firstDate = date("m-d-Y", strtotime($_yourDateString));

สำหรับวันที่ใหม่

$_newDate = date("Y-m-d",strtotime($_yourDateString));

2

หากคุณมีรูปแบบ dd-mm-yyyy แล้วใน PHP มันจะไม่ทำงานตามที่คาดไว้ ในเอกสาร PHP มีคำแนะนำด้านล่าง

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

ดังนั้นคุณไม่สามารถใช้ตามที่คุณต้องการ เมื่อคุณพยายามที่จะใช้รูปแบบ dd / mm / yyyy ด้วยสิ่งนี้มันจะลบ FALSE คุณสามารถปรับแต่งดังต่อไปนี้

$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
  $timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600

1

เช่นเดียวกับเรามีวันที่ "07 / พฤษภาคม / 2018" และเราต้องการวันที่ "2018-05-07" ในฐานะที่เป็น mysql เข้ากันได้

if (!empty($date)) {
    $timestamp = strtotime($date);
    if ($timestamp === FALSE) {
         $timestamp = strtotime(str_replace('/', '-', $date));
     }
         $date = date('Y-m-d', $timestamp);
  }

มันใช้งานได้สำหรับฉัน สนุก :)


0

เนื่องจากไม่มีใครพูดถึงเรื่องนี้นี่เป็นอีกวิธีหนึ่ง:

$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");


0

หากคุณต้องการยอมรับวันที่โดยใช้การสั่งซื้อแบบอเมริกัน (เดือน, วันที่, ปี) สำหรับรูปแบบสไตล์ยุโรป (ใช้เส้นประหรือระยะเวลาเป็นวัน, เดือน, ปี) ในขณะที่ยังรับรูปแบบอื่น ๆคุณสามารถขยายคลาส DateTime:

/**
 * Quietly convert European format to American format
 *
 * Accepts m-d-Y, m-d-y, m.d.Y, m.d.y, Y-m-d, Y.m.d
 * as well as all other built-in formats
 * 
 */
class CustomDateTime extends DateTime 
{
  public function __construct(string $time="now", DateTimeZone $timezone = null) 
  {
    // convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y (substr avoids microtime error)
    $time = str_replace(['-','.'], '/', substr($time, 0, 10)) . substr($time, 10 );

    parent::__construct($time, $timezone);
  }
}

// usage:
$date = new CustomDateTime('7-24-2019');
print $date->format('Y-m-d');

// => '2019-07-24'

หรือคุณสามารถสร้างฟังก์ชั่นเพื่อยอมรับ mdY และเอาต์พุต Ymd:

/**
 * Accept dates in various m, d, y formats and return as Y-m-d
 * 
 * Changes PHP's default behaviour for dates with dashes or dots.
 * Accepts:
 *   m-d-y, m-d-Y, Y-m-d,
 *   m.d.y, m.d.Y, Y.m.d,
 *   m/d/y, m/d/Y, Y/m/d,
 *   ... and all other formats natively supported 
 * 
 * Unsupported formats or invalid dates will generate an Exception
 * 
 * @see https://www.php.net/manual/en/datetime.formats.date.php PHP formats supported
 * @param  string $d various representations of date
 * @return string    Y-m-d or '----' for null or blank
 */
function asYmd($d) {
  if(is_null($d) || $d=='') { return '----'; }

  // convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y
  $d = str_replace(['-','.'], '/', $d);

  return (new DateTime($d))->format('Y-m-d');
}

// usage:

<?= asYmd('7-24-2019') ?>

// or

<?php echo asYmd('7-24-2019'); ?>

0

เพื่อสร้างวันที่จากการใช้สตริง:
$ date = DateTime :: createFromFormat ('dmy H: i', '01 -01-01 01:00 '); echo $ date-> format ('Ymd H: i');

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