Dizeyi Date ve DateTime değerine dönüştürme


293

mm-dd-YYYY(Örneğin, 10-16-2003) biçiminde bir PHP dizesi varsa , nasıl düzgün bir Dateve sonra a DateTimebiçiminde dönüştürmek nasıl YYYY-mm-dd? Her ikisi için sormak tek nedeni Dateve DateTimeben bir noktada bir tane ve farklı bir noktada diğer gerektiğinden olduğunu.

Yanıtlar:


481

strtotime()İlk randevunuzda kullanın , ardından date('Y-m-d')geri dönüştürmek için:

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

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

echo $newformat;
// 2003-10-16

Eğik çizgi kullanarak arasında bir fark olduğunu not edin /ve tire -içinde strtotime()işlevi. Php.net'ten alıntı yapmak için:

M / d / y veya dmy formatlarındaki tarihler, çeşitli bileşenler arasındaki ayırıcıya bakılarak belirsizleştirilir: ayırıcı bir eğik çizgi (/) ise, Amerikan m / d / y olduğu varsayılır; ayırıcı bir tire (-) veya nokta (.) ise, Avrupa dmy formatı varsayılır.

Olası belirsizliği önlemek için, ISO 8601 (YYYY-AA-GG) tarihlerini veya mümkünse DateTime :: createFromFormat () yöntemini kullanmak en iyisidir.


11
Bu işe yaramaz. PHP bu girdiyi DD-AA-YYYY olarak yorumlayacaktır.
Matthew

benim kod biraz daha açıklama ekledi, teşekkürler @konforce
Ibu

9
Daha iyi bir çözüm için bir sonraki cevabı okuyun
Manuel Bitto

@delive tarih dizeniz büyük olasılıkla doğru bir tarih değil.
Ibu

8
Bu işe yaramıyor çünkü bu cevap yanıltıcı. strtotimebelirli biçimleri kabul eder. Ne olursa olsun onu besleyemezsin. Bu yüzden DateTime::createFromFormatyerine kullanılmalı strtotime. Ne yazık ki, bu cevabın herkesin dikkatini çekmesi için çok fazla upvotes var. Bugünlerde hepsi kopyala yapıştır.
NB

432

M / d / Y ve mdY formatlarına dikkat etmelisiniz. PHP /, m / d / Y ve -dmY anlamına gelir. Bu durumda açıkça giriş biçimini açıklar:

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

Bu şekilde belli bir yorumun kaprisine girmezsiniz.


37
Bunun neden kabul edilen cevap olmadığını merak ediyorum ... Bu, strtotime()fonksiyonun tuhaflıklarına güvenmekten çok daha esnektir .
jzimmerman2011

9
PHP DateTime sınıfının PHP 5.2'den beri mevcut olduğunu ve 5.3'ten beri createFromFormat'ı işaret etmek önemlidir
Diego Nemo

14
Her fonksiyonda olduğu gibi, desteklemeniz gereken minimum sürümü karşılayıp karşılamadığını kontrol etmelisiniz. Ama PHP 5.2 EOL Ocak 2011 idi. Artık kimse çalıştırmıyor olmalı; Bu insanlara yemek sağlamak sadece eski, güvensiz yazılım çalıştırmalarını sağlıyor.
Matthew

@Matthew evet, doğru. Ama sen asla, bugün bile bugün hala yüklü bir PHP4.1 sürümü buldum ...
Roland

29

Tarihi ayrıştırmak için şunu kullanmalısınız: DateTime :: createFromFormat ();

Ör:

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

Ancak, dikkatli olun, çünkü bununla çökecektir:

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

Aslında önce biçimlendirmenin iyi olup olmadığını kontrol etmeniz gerekir:

$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");

Şimdi çökmek yerine, yakalayabileceğiniz, ilerleyebileceğiniz vb. Bir istisna alacaksınız.

$ dateDE yanlış biçime sahip, "16.10.2013" olmalıdır;


$ DateObj öğesinin bu şekilde denetlenmesinin, tarihin gerçekten geçerli olduğunu değil, yalnızca biçimin maske ile eşleştiğini garanti ettiğine dikkat edin. Örneğin, 99/99/2010 gibi bir tarih m / d / Y ile eşleştiği için bu kontrolü geçecektir, ancak genellikle izin vermek istediğiniz bir tarih değildir. Bu yanıt bu durumu ele alıyor -> 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

Düzenleme: Ayrıca, DateTimeZone öğesine DateTime () yapıcısını ileterek sunucunun varsayılan saatini değil, istenen saat dilimi için tarih oluşturulmasını sağlayabilirsiniz.


6
16 ay geçersiz olduğu için bunun bir istisna getireceğine inanıyorum.
Matthew

PHP DateTime sınıfının PHP 5.2'den beri mevcut olduğunu ve 5.3'ten beri getTimestamp olduğunu belirtmek önemlidir.
Diego Nemo

2

İlk Tarih için

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

Yeni Tarih İçin

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

2

Eğer dd-mm-yyyy biçiminiz varsa, PHP'de beklendiği gibi çalışmaz. PHP belgesinde kılavuzun altındalar.

M / d / y veya dmy formatlarındaki tarihler, çeşitli bileşenler arasındaki ayırıcıya bakılarak belirsizleştirilir: ayırıcı bir eğik çizgi (/) ise, Amerikan m / d / y olduğu varsayılır; ayırıcı bir tire (-) veya nokta (.) ise, Avrupa dmy formatı varsayılır.

Yani, istediğiniz gibi kullanamazsınız. Bununla gg / aa / yyyy biçimini kullanmaya çalıştığınızda FALSE kaldırılır. Aşağıdakiler ile ince ayar yapabilirsiniz.

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

1

"07 / Mayıs / 2018" tarihimiz var ve mysql uyumlu olarak "2018-05-07" tarihine ihtiyacımız var

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

Benim için çalışıyor. zevk almak :)


0

Kimse bundan bahsetmediği için başka bir yol var:

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


0

Diğer biçimleri kabul ederken Avrupa tarzı biçimler için Amerikan düzenini (ay, tarih, yıl) kullanarak tarihleri ​​kabul etmek istiyorsanız (tire veya dönemi gün, ay, yıl olarak kullanarak) , DateTime sınıfını genişletebilirsiniz:

/**
 * 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'

Veya, mdY'yi kabul etmek ve Ymd çıktısını almak için bir işlev yapabilirsiniz:

/**
 * 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

herhangi bir dizeden tarih oluşturmak için şunu kullanın:
$ date = DateTime :: createFromFormat ('dmy H: i', '01 -01-01 01:00 '); echo $ date-> format ('Ymd H: i');

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.