回答:
簡略化したソリューションは次のとおりです。
$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));
結果:
2010-05-25
strtotime
ドキュメントは読み取ります。
m / d / yまたはdmy形式の日付は、さまざまなコンポーネント間のセパレーターを確認することで明確になります。セパレーターがスラッシュ(/)の場合は、アメリカのm / d / yが想定されます。一方、区切り文字がダッシュ(-)またはドット(。)の場合、ヨーロッパのdmy形式が想定されます。
echo date('Y-m-l', strtotime('01-01-2010'));
結果は2010-01-Friday
です。したがって、最後に来る日は、date
関数に日付形式を指定する方法によって異なります。
$date = '25/05/2010'; $date = str_replace('/', '-', $date);
です。問題を解決するために追加の行は必要ありません。
DateTime :: createFromFormatを使用して、カスタム形式(PHP 5.3以降)から日付を解析できます
$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();
(余談:!
は、指定されていない値をUnixタイムスタンプにリセットするために使用されます。つまり、時刻は午前0時になります。)
PHP 5.3を使用したくない(または使用できない)場合、strtotimeが受け入れる使用可能な日付/時刻形式の完全なリストは、日付形式のマニュアルページにリストされています。そのページでm/d/Y
は、推測された事実についてより詳しく説明してd/m/Y
います(ただし、ここでの回答で述べたようにd-m-Y
、d.m.Y
またはを使用できますd\tm\tY
)。
過去にはstr_replace
、別の答えで言及されている簡単な方法、および日付文字列を次のような別の形式に自己解析する手段も使用しました
$subject = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);
これは多くの問題に対する良い解決策です:
function datetotime ($date, $format = 'YYYY-MM-DD') {
if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);
if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);
if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);
return mktime(0, 0, 0, $month, $day, $year);
}
STRTOTIMEの記述から注:
m / d / yまたはdmy形式の日付は、さまざまなコンポーネント間の区切り文字を調べることで明確になります。区切り文字がスラッシュ(/)の場合は、アメリカのm / d / yであると見なされます。一方、区切り文字がダッシュ(-)またはドット(。)の場合は、ヨーロッパのdmy形式が想定されます。
それはそれと同じくらい簡単です。
$t
し$t1
て別の結果を表示しているときに実装できます。このようにチェックしました。 $t=strtotime(date('d-m-Y'));
および $t1=strtotime(date('m/d/Y'));
より良い解決策が見つかりません。あなたは使用することができexplode()
、preg_match_all()
など
私はこのような静的ヘルパー関数を持っています
class Date {
public static function ausStrToTime($str) {
$dateTokens = explode('/', $str);
return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]);
}
}
おそらくもっと良い名前がありますがausStrToTime()
、オーストラリアの日付(私がよく扱うオーストラリア人)で機能するので使用します。より良い名前はおそらく標準化された名前でしょうが、それが何であるかはわかりません。
ddmmyy形式をdate("Y-m-d"
形式に変換しようとしましたが、直接渡すと機能しませんでしたddmmyy =date('dmy')
次に、それがyyyy-mm-dd形式でなければならないことに気付きました。部分文字列を使用して整理
$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);
次に渡された date("Y-m-d",strtotime($strParam));
出来た!
この値をデータベースから取得していますか?その場合は、データベースでフォーマットすることを検討してください(date_format
たとえば、mysqlで使用)。そうでない場合は、strtotimeがdd / mm / yyyyの値を正しく認識していないように見えるため、値を分解するのが最善の策である可能性があります。
dd / mm / YYYYであることがわかっている場合は、次のようにできます。
$regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
$match = array();
if (preg_match($regex, $date, $match)) {
if (strlen($match[3]) == 2) {
$match[3] = '20' . $match[3];
}
return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
}
return strtotime($date);
d / m / YYまたはdd / mm / YYYY(または2つの任意の組み合わせ)の形式の日付に一致します...
/以外の区切り文字もサポートしたい場合は、正規表現を次のように変更できます。
$regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';
次に、[/-]
ビットに必要な文字を追加します(注-文字は最後にする必要があります)
\d
小数点以下の桁数のためではなく、[/d]
ために、スラッシュまたはd文字。
この回避策は、explodeよりシンプルでエレガントです。
$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);
日付を取得する形式を知っている必要はありませんが、スラッシュが付いている場合、それらは完全なストップに置き換えられ、strtotimeによってヨーロッパ言語として扱われます。
最も簡単な解決策はこれです:
$date = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));
$ date_info = '2019年2月20日'; echo date( 'Ym-d'、strtotime(str_replace( '/'、 '-'、$ date_info)));
str_replace('/', '-', $date);