回答:
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()を使用するのが最善です。
strtotime
特定のフォーマットを受け入れます。あなたは何でもそれを養うことはできません。そのDateTime::createFromFormat
ため、の代わりに使用する必要がありstrtotime
ます。残念なことに、この回答には賛成票が多すぎて誰も注目できません。最近はすべてコピーペーストです。
m / d / YおよびmdY形式には注意する必要があります。PHPは/
、m / d / Y -
を意味し、dmYを意味すると見なします。この場合、入力形式を明示的に説明します。
$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');
そうすれば、あなたはある解釈の気まぐれではありません。
strtotime()
関数の癖に依存するよりもはるかに柔軟です。
日付を解析するには、次を使用する必要があります: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」である必要があります。
$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16
編集:DateTimeZoneをDateTime()コンストラクターに渡して、サーバーのデフォルトではなく、目的のタイムゾーンの日付を作成することもできます。
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
ヨーロピアンスタイルの形式(ダッシュまたはピリオドを日、月、年として使用)にアメリカの順序(月、日付、年)を使用して日付を受け入れ、他の形式を受け入れたい場合は、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'); ?>
任意の文字列から日付を作成するには、次のようにします。
$ date = DateTime :: createFromFormat( 'dmy H:i'、'01 -01-01 01:00 '); echo $ date-> format( 'Ymd H:i');