web-dev-qa-db-ja.com

文字列をDateとDateTimeに変換する

PHP文字列がmm-dd-YYYYの形式(たとえば、10-16-2003)である場合、それをDateに、次にYYYY-mm-ddの形式のDateTimeに正しく変換するにはどうすればよいですか。私がDateDateTimeの両方を要求する唯一の理由は、一方を別の場所に、もう一方を別の場所に必要とするからです。

249
Chris Pinski

最初の日付に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またはd-m-y形式の日付は、さまざまな構成要素の間の区切り記号を見て曖昧さがなくなります。区切り文字がスラッシュ(/)の場合は、アメリカのm/d/yが想定されます。一方、区切り文字がダッシュ( - )またはドット(。)の場合は、ヨーロッパのd-m-y形式が想定されます。

411
Ibu

あなたはm/d/Yとm-d-Yフォーマットに注意する必要があります。 PHPは/をm/d/Y、-をd-m-Yと見なします。この場合の入力フォーマットを明示的に説明します。

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

そのようにあなたはある解釈の気まぐれにいません。

391
Matthew

日付を解析するには、次のようにします。DateTime :: createFromFormat();

例:

$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」になります。

25
user2707671
$d = new DateTime('10-16-2003');

$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16

編集:DateTimeZoneをDateTime()コンストラクタに渡して、サーバーのデフォルトのタイムゾーンではなく、希望のタイムゾーンの日付を確実に作成することもできます。

22
N.B.

フォーマットがdd-mm-yyyyの場合、PHPでは期待通りに動作しません。 PHPドキュメントでは、ガイドラインの下にあります。

M/d/yまたはd-m-y形式の日付は、さまざまな構成要素の間の区切り記号を見て曖昧さがなくなります。区切り文字がスラッシュ(/)の場合は、アメリカのm/d/yが想定されます。一方、区切り文字がダッシュ( - )またはドット(。)の場合は、ヨーロッパのd-m-y形式が想定されます。

だから、あなたはあなたが望むように使うことはできません。これでdd/mm/yyyyフォーマットを使おうとすると、FALSEが取り除かれます。あなたは以下で微調整することができます。

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

最初の日付の場合

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

新しい日付の場合

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

Mysql互換の日付として "2018年5月7日"と "2018年5月5日"が必要

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

わたしにはできる。楽しい :)

0
Newton Singh

誰もこれに言及していないので、別の方法があります:

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

0
Sodj

ヨーロッパ形式の形式(ダッシュ、または期間を日、月、年として使用)でアメリカの順序(月、日付、年)を使用して日付を受け入れたい場合、他の形式を受け入れながら、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'

または、m-d-Yを受け入れて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'); ?>
0
Tim Morton