หากฉันมีสตริง PHP ในรูปแบบของmm-dd-YYYY
(เช่น 10-16-2003) ฉันจะแปลงให้เป็น a Date
และ a DateTime
ในรูปแบบได้YYYY-mm-dd
อย่างไร เหตุผลเดียวที่ฉันขอทั้งสองDate
และDateTime
เป็นเพราะฉันต้องการหนึ่งในจุดหนึ่งและอื่น ๆ ในจุดที่แตกต่างกัน
หากฉันมีสตริง PHP ในรูปแบบของmm-dd-YYYY
(เช่น 10-16-2003) ฉันจะแปลงให้เป็น a Date
และ a DateTime
ในรูปแบบได้YYYY-mm-dd
อย่างไร เหตุผลเดียวที่ฉันขอทั้งสองDate
และDateTime
เป็นเพราะฉันต้องการหนึ่งในจุดหนึ่งและอื่น ๆ ในจุดที่แตกต่างกัน
คำตอบ:
ใช้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 () เมื่อเป็นไปได้
strtotime
ยอมรับรูปแบบที่แน่นอน คุณไม่สามารถให้อาหารอะไร นั่นเป็นเหตุผลที่ควรจะนำมาใช้แทนDateTime::createFromFormat
strtotime
น่าเศร้าคำตอบนี้มี upvotes มากเกินไปสำหรับทุกคนที่ให้ความสนใจ มันคือทั้งหมดที่คัดลอกวางวันนี้
คุณต้องระวังด้วยรูปแบบ m / d / Y และ mdY PHP พิจารณา/
ว่าหมายถึง m / d / Y และ-
หมายถึง dmY ฉันจะอธิบายรูปแบบการป้อนข้อมูลอย่างชัดเจนในกรณีนี้:
$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');
ด้วยวิธีนี้คุณไม่ได้อยู่ที่การตีความที่แน่นอน
strtotime()
ฟังก์ชั่น
ในการแยกวิเคราะห์วันที่คุณควรใช้: 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";
$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16
แก้ไข: คุณยังสามารถส่งตัวสร้าง DateTimeZone ไปยัง DateTime () เพื่อให้แน่ใจว่าการสร้างวันที่สำหรับเขตเวลาที่ต้องการไม่ใช่ค่าเริ่มต้นของเซิร์ฟเวอร์
สำหรับวันแรก
$_firstDate = date("m-d-Y", strtotime($_yourDateString));
สำหรับวันที่ใหม่
$_newDate = date("Y-m-d",strtotime($_yourDateString));
หากคุณมีรูปแบบ 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
เช่นเดียวกับเรามีวันที่ "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);
}
มันใช้งานได้สำหรับฉัน สนุก :)
เนื่องจากไม่มีใครพูดถึงเรื่องนี้นี่เป็นอีกวิธีหนึ่ง:
$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");
หากคุณต้องการยอมรับวันที่โดยใช้การสั่งซื้อแบบอเมริกัน (เดือน, วันที่, ปี) สำหรับรูปแบบสไตล์ยุโรป (ใช้เส้นประหรือระยะเวลาเป็นวัน, เดือน, ปี) ในขณะที่ยังรับรูปแบบอื่น ๆคุณสามารถขยายคลาส 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'); ?>
เพื่อสร้างวันที่จากการใช้สตริง:
$ date = DateTime :: createFromFormat ('dmy H: i', '01 -01-01 01:00 '); echo $ date-> format ('Ymd H: i');