Jika saya memiliki PHP string dalam format mm-dd-YYYY
(misalnya, 10-16-2003), bagaimana cara yang benar untuk mengkonversi ke Upload
dan kemudian DateTime
dalam format YYYY-mm-dd
? Satu-satunya alasan saya meminta untuk Date
dan DateTime
adalah karena saya perlu satu dalam satu tempat, dan yang lainnya di tempat yang berbeda.
Gunakan strtotime()
pada kencan pertama anda kemudian date('Y-m-d')
untuk mengubahnya kembali:
$time = strtotime('10/16/2003');
$newformat = date('Y-m-d',$time);
echo $newformat;
// 2003-10-16
Membuat catatan bahwa ada perbedaan antara menggunakan slash /
dan tanda -
di strtotime()
fungsi. Mengutip dari php.net:
Tanggal m/d/y atau d-saya format yang disatukan dengan melihat pemisah antara berbagai komponen: jika separator adalah slash (/), maka Amerika m/d/y diasumsikan; sedangkan jika separator adalah dash (-) atau titik (.), maka Eropa d-saya format diasumsikan.
Anda perlu berhati-hati dengan m/d/Y dan m-d-Y format. PHP menganggap /
berarti m/d/Y dan -
berarti d-m-Y. saya akan secara eksplisit menggambarkan format input dalam hal ini:
$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');
Dengan cara itu anda tidak pada keinginan dari interpretasi tertentu.
Untuk mengurai tanggal, anda harus menggunakan: DateTime::createFromFormat();
Ex:
$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");
Namun, hati-hati, karena ini akan crash dengan:
PHP Fatal error: Call to a member function format() on a non-object
Anda benar-benar perlu untuk memeriksa bahwa format berjalan baik-baik saja, pertama:
$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");
Sekarang bukan menabrak, anda akan mendapatkan pengecualian, yang dapat anda nikmati, menyebarkan, dll.
$dateDE memiliki format yang salah, itu harus "16.10.2013";
$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16
Edit: anda juga dapat lulus DateTimeZone untuk DateTime() constructor untuk menjamin terciptanya tanggal untuk zona waktu yang diinginkan, bukan server default.
Jika anda memiliki format dd-mm-yyyy kemudian di PHP itu tidak't bekerja seperti yang diharapkan. Di PHP dokumen mereka memiliki pedoman di bawah ini.
Tanggal m/d/y atau d-saya format yang disatukan dengan melihat pemisah antara berbagai komponen: jika separator adalah slash (/), maka Amerika m/d/y diasumsikan; sedangkan jika pemisah tanda strip (-) atau titik (.), kemudian Eropa d-saya format ini diasumsikan.
Jadi, anda hanya dapat't menggunakan seperti yang anda inginkan. Ketika anda mencoba untuk menggunakan dd/mm/yyyy format dengan ini maka itu akan menghapus PALSU. Anda dapat men-tweak dengan berikut ini.
$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
Seperti yang telah kita upload "07/Mei/2018" dan kita perlu upload "2018-05-07" seperti mysql kompatibel
if (!empty($date)) {
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
$date = date('Y-m-d', $timestamp);
}
Ia bekerja untuk saya. menikmati :)
Jika anda ingin menerima tanggal menggunakan American pemesanan (bulan, tanggal, tahun) untuk gaya Eropa format (menggunakan dash atau periode tertentu seperti hari, bulan, tahun) sementara masih menerima format lain, anda dapat memperpanjang DateTime kelas:
/**
* 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'
Atau, anda dapat membuat sebuah fungsi untuk menerima m-d-Y dan output Y-m-d:
/**
* 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'); ?>