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.