文字列を日付と日付時刻に変換する


292

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

回答:


480

strtotime()最初の日付に使用してdate('Y-m-d')から、変換して戻します。

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

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

echo $newformat;
// 2003-10-16

関数でのスラッシュ/とハイフンの使用には違いがあることに注意してください。php.netから引用するには:-strtotime()

m / d / yまたはdmy形式の日付は、さまざまなコンポーネント間のセパレーターを確認することで明確になります。セパレーターがスラッシュ(/)の場合、アメリカのm / d / yが想定されます。一方、区切り文字がダッシュ(-)またはドット(。)の場合は、ヨーロッパのdmy形式が想定されます。

可能性のある曖昧さを回避するために、可能であればISO 8601(YYYY-MM-DD)の日付またはDateTime :: createFromFormat()を使用するのが最善です。


11
これは機能しません。PHPはその入力をDD-MM-YYYYとして解釈します。
Matthew

@konforceのおかげで、コードにもう少し説明を追加しました
Ibu

9
より良い解決策については、次の回答を読んでください
Manuel Bitto 2013年

@deliveあなたの日付文字列はおそらく正しい日付ではありません。
イブ

8
この回答は誤解を招くため、機能しません。strtotime特定のフォーマットを受け入れます。あなたは何でもそれを養うことはできません。そのDateTime::createFromFormatため、の代わりに使用する必要がありstrtotimeます。残念なことに、この回答には賛成票が多すぎて誰も注目できません。最近はすべてコピーペーストです。
NB

432

m / d / YおよびmdY形式には注意する必要があります。PHPは/、m / d / Y -を意味し、dmYを意味すると見なします。この場合、入力形式を明示的に説明します。

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

そうすれば、あなたはある解釈の気まぐれではありません。


37
なぜこれが受け入れられない答えであるかについて興味があります...これはstrtotime()関数の癖に依存するよりもはるかに柔軟です。
jzimmerman2011

9
php DateTimeクラスがPHPバージョン5.2以降で使用可能であり、createFromFormatが5.3以降使用可能であることを指摘することが重要です
Diego Nemo

14
すべての関数と同様に、サポートする必要がある最小バージョンを満たしているかどうかを確認する必要があります。しかし、PHP 5.2 EOLは2011年1月でした。誰もそれを実行すべきではありません。それらの人々へのケータリングは、彼らが時代遅れで安全でないソフトウェアを走らせることを可能にしているだけです。
Matthew

@マシューはい、正しいです。しかし、あなたは今、決して今でもPHP4.1バージョンがインストールされているのを発見しました...
Roland

29

日付を解析するには、次を使用する必要があります: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」である必要があります。


$ dateObjをそのようにチェックしても、フォーマットがマスクと一致することのみが保証され、日付が実際に有効であるとは限らないことに注意してください。たとえば、99/99/2010のような日付はm / d / Yに一致するため、このチェックに合格しますが、通常は許可したくない日付です。この回答はこの状況に対処します-> stackoverflow.com/a/10120725/995014
Kilian Perdomo Curbelo 2018年

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

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

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


6
16か月目が​​無効であるため、例外がスローされると思います。
Matthew

php DateTimeクラスがPHPバージョン5.2以降で使用可能であり、getTimestampが5.3以降使用可能であることを指摘することが重要です
Diego Nemo

2

初デート

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

新しい日付

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

2

dd-mm-yyyyの形式の場合、PHPでは期待どおりに機能しません。PHPドキュメントでは、以下のガイドラインがあります。

m / d / yまたはdmy形式の日付は、さまざまなコンポーネント間のセパレーターを確認することで明確になります。セパレーターがスラッシュ(/)の場合、アメリカのm / d / yが想定されます。一方、区切り文字がダッシュ(-)またはドット(。)の場合は、ヨーロッパのdmy形式が想定されます。

だから、思いのままに使えない。これでdd / mm / yyyy形式を使用しようとすると、FALSEが削除されます。次の方法で調整できます。

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

1

我々が日付「2018年5月7日」を持っているように、mysql互換として日付「2018-05-07」が必要

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

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


0

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

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


0

ヨーロピアンスタイルの形式(ダッシュまたはピリオドを日、月、年として使用)にアメリカの順序(月、日付、年)を使用して日付を受け入れ、他の形式を受け入れたい場合は、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'

または、mdYを受け入れて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'); ?>

0

任意の文字列から日付を作成するには、次のようにします。
$ date = DateTime :: createFromFormat( 'dmy H:i'、'01 -01-01 01:00 '); echo $ date-> format( 'Ymd H:i');

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.