我正在尝试格式化从英国格式到YYYY-MM-DD的日期,结果很奇怪。
我使用的代码是:
echo "<br>".$_GET['trans_date'];
echo "<br>".$_GET['next_payment'];
echo "<br>".$_GET['payment_date'];
echo "<br><br>".date("Y-m-d", strtotime($_GET['trans_date']));
echo "<br>".date("Y-m-d", strtotime($_GET['next_payment']));
echo "<br>".date("Y-m-d", strtotime($_GET['payment_date']));
我得到以下结果:
19/05/2016
01/06/2016
19/05/2016
1970-01-01
2016-01-06
1970-01-01
我期待以下结果:
19/05/2016
01/06/2016
19/05/2016
2016-05-19
2016-01-01
2016-05-19
任何人都可能出错吗?
谢谢,
约翰
答案 0 :(得分:2)
您无法真正为strtotime设置区域设置。
如果你是美国人,你会看到11/12/10,并认为“2010年11月12日”。
如果你是澳大利亚人(或欧洲人),你认为这是“2010年12月11日”。
如果您是读取ISO的系统管理员,则看起来像“2011年12月10日”。
补偿此问题的最佳方法是修改加入字符。
正斜杠(/)表示美国M / D / Y格式, 短划线( - )表示欧洲D-M-Y和 句号(。)表示ISO Y.M.D.
所以,我的建议总是使用DateTime对象来避免不必要的错误。
Ex: $date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d');
提出您的问题,解决方案是:
$trans_date = DateTime::createFromFormat('d/m/Y', $_GET['trans_date']);
$next_payment_date = DateTime::createFromFormat('d/m/Y', $_GET['next_payment']);
$payment_date = DateTime::createFromFormat('d/m/Y', $_GET['payment_date']);
echo "<br><br>".$trans_date->format('Y-m-d');
echo "<br>".$next_payment_date->format('Y-m-d');
echo "<br>".$payment_date->format('Y-m-d');
答案 1 :(得分:1)
这应该有效:
echo "<br><br>".date("Y-m-d", strtotime(str_replace('/', '-', $_GET['trans_date'])));
echo "<br>".date("Y-m-d", strtotime(str_replace('/', '-', $_GET['next_payment'])));
echo "<br>".date("Y-m-d", strtotime(str_replace('/', '-', $_GET['payment_date'])));
答案 2 :(得分:1)
只需将您指定的日期设为05/19/2016
表示mm/dd/yy
格式,即可修复。