Mengubah string menjadi Date and DateTime

292

Jika saya memiliki string PHP dalam format mm-dd-YYYY(misalnya, 10-16-2003), bagaimana cara mengonversinya dengan benar menjadi Datedan kemudian DateTimedalam format YYYY-mm-dd? Satu-satunya alasan saya meminta keduanya Datedan DateTimekarena saya membutuhkan satu di satu tempat, dan yang lainnya di tempat yang berbeda.

Chris Pinski
sumber

Jawaban:

480

Gunakan strtotime()pada kencan pertama Anda lalu date('Y-m-d')untuk mengubahnya kembali:

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

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

echo $newformat;
// 2003-10-16

Perhatikan bahwa ada perbedaan antara menggunakan garis miring /dan tanda hubung -dalam strtotime()fungsi. Mengutip dari php.net:

Tanggal dalam format m / d / y atau dmy tidak jelas dengan melihat pemisah antara berbagai komponen: jika pemisah adalah garis miring (/), maka m / d / y Amerika diasumsikan; sedangkan jika pemisah adalah tanda hubung (-) atau titik (.), maka format dmy Eropa diasumsikan.

Untuk menghindari kemungkinan ambiguitas, sebaiknya gunakan tanggal ISO 8601 (YYYY-MM-DD) atau DateTime :: createFromFormat () jika memungkinkan.

Ibu
sumber
11
Ini tidak akan berhasil. PHP akan menafsirkan input itu sebagai DD-MM-YYYY.
Matius
Saya menambahkan sedikit penjelasan pada kode saya, terima kasih @konforce
Ibu
9
Baca jawaban berikutnya untuk solusi yang lebih baik
Manuel Bitto
@ hapus string tanggal Anda kemungkinan besar bukan tanggal yang benar.
Ibu
8
Tidak berfungsi karena jawaban ini menyesatkan. strtotimemenerima format tertentu. Anda tidak bisa memberinya makan apa pun. Itu sebabnya DateTime::createFromFormatharus digunakan strtotime. Sayangnya, jawaban ini memiliki terlalu banyak upvotes untuk diperhatikan siapa pun. Ini semua salin tempel hari ini.
NB
432

Anda harus berhati-hati dengan format m / d / Y dan mdY. PHP menganggap /berarti m / d / Y dan -berarti dmY. Saya akan secara eksplisit menggambarkan format input dalam kasus ini:

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

Dengan begitu Anda tidak pada tingkah interpretasi tertentu.

Matius
sumber
37
Ingin tahu mengapa ini bukan jawaban yang diterima ... Ini jauh lebih fleksibel daripada bergantung pada kebiasaan strtotime()fungsi.
jzimmerman2011
9
Penting untuk menunjukkan bahwa kelas DateTime php tersedia sejak PHP versi 5.2 dan createFromFormat sejak 5.3
Diego Nemo
14
Seperti halnya setiap fungsi, Anda harus memeriksa apakah itu memenuhi versi minimum yang harus Anda dukung. Tapi PHP 5.2 EOL adalah Januari 2011. Tidak ada yang harus menjalankannya lagi; melayani orang-orang hanya memungkinkan mereka untuk menjalankan perangkat lunak usang dan tidak aman.
Matius
@ Matius ya, benar. Tetapi Anda tidak pernah sekarang, bahkan hari ini saya menemukan versi PHP4.1 masih diinstal ...
Roland
29

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 macet dengan:

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

Anda sebenarnya perlu memeriksa bahwa pemformatan berjalan baik, 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 alih-alih menabrak, Anda akan mendapatkan pengecualian, yang dapat Anda tangkap, sebarkan, dll.

$ dateDE memiliki format yang salah, seharusnya "16.10.2013";

pengguna2707671
sumber
Perhatikan bahwa memeriksa $ dateObj dengan cara itu hanya akan memastikan bahwa formatnya cocok dengan mask, bukan bahwa tanggal tersebut benar-benar valid. Misalnya, tanggal seperti 99/99/2010 akan melewati pemeriksaan ini karena cocok dengan m / d / Y tetapi itu bukan tanggal yang biasanya ingin Anda izinkan. Jawaban ini mengatasi situasi ini -> 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

Sunting: Anda juga dapat meneruskan konstruktor DateTimeZone ke DateTime () untuk memastikan pembuatan tanggal untuk zona waktu yang diinginkan, bukan yang default server.

NB
sumber
6
Saya percaya ini akan melempar pengecualian karena bulan 16 tidak valid.
Matius
Penting untuk menunjukkan bahwa kelas PHP DateTime tersedia sejak PHP versi 5.2 dan getTimestamp sejak 5.3
Diego Nemo
2

Untuk kencan pertama

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

Untuk Tanggal Baru

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

Jika Anda memiliki format dd-mm-yyyy maka dalam PHP itu tidak akan berfungsi seperti yang diharapkan. Dalam dokumen PHP mereka memiliki pedoman di bawah ini.

Tanggal dalam format m / d / y atau dmy tidak jelas dengan melihat pemisah antara berbagai komponen: jika pemisah adalah garis miring (/), maka m / d / y Amerika diasumsikan; sedangkan jika pemisah adalah tanda hubung (-) atau titik (.), maka format dmy Eropa diasumsikan.

Jadi, Anda tidak bisa menggunakan sesuai keinginan. Ketika Anda mencoba menggunakan format dd / mm / yyyy dengan ini maka itu akan menghapus SALAH. Anda dapat mengubah dengan yang berikut ini.

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

Seperti kita memiliki tanggal "07 / Mei / 2018" dan kita perlu tanggal "2018-05-07" sebagai kompatibel dengan mysql

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

Ini bekerja untuk saya. Nikmati :)

Newton Singh
sumber
0

Karena tidak ada yang menyebutkan ini, berikut ini cara lain:

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

Sodj
sumber
0

Jika Anda ingin menerima tanggal menggunakan pemesanan Amerika (bulan, tanggal, tahun) untuk format gaya Eropa (menggunakan tanda hubung atau periode sebagai hari, bulan, tahun) sambil tetap menerima format lain , Anda dapat memperluas kelas 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'

Atau, Anda dapat membuat fungsi untuk menerima mdY dan output 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'); ?>
Tim Morton
sumber
0

untuk membuat tanggal dari string apa pun, gunakan:
$ date = DateTime :: createFromFormat ('dmy H: i', '01 -01-01 01:00 '); echo $ date-> format ('Ymd H: i');

Azouz Mohamadi
sumber