DateTime 不适用于 1970 年之前的日期
DateTime not working for dates before 1970
PHP v 5.6.2
我需要将诸如 18-Jul-46 之类的日期转换为 18/07/1946 并且没有多少 DateTime 函数可以正常工作。 (因为 strtotime 不适用于 1970 年之前的日期)。他们最终都给出了 18/07/2046,这是不正确的。
到目前为止我尝试过的代码:
$date = new DateTime("18-Jul-46");
$date->format('d/m/Y');
另一个带日期时间
$date = DateTime::createFromFormat('d-M-y', "18-Jul-46");
$date->format('d/m/Y');
之前也试过,
$date = date('d/m/Y', strtotime('18-Jul-46'));
None 给了我正确的格式。感谢任何指点或帮助。
提前致谢!
计算机不知道你是指 2000 还是 1900。你可以只取年份的最后 2 位数字,然后在前面加上“19”,例如:
$date = new DateTime("18-Jul-46");
$date->format('d/m/19y');
如果您也想使用 2000,此代码将使用最接近 1970 的数字
$date = new DateTime("18-Jul-20");
$date->format('d/m/Y');
$t1 = $date->format('19y');
$t2 = $date->format('20y');
if(abs(1970-$t1)<abs(1970-$t2))
echo $t1; //Take the 19.. one
else
echo $t2; //Take the 20.. one
但最后,你不能确定 2030 年是否正确。
如果您有诸如“31-Dec-18”之类的日期,则它是不明确的,因为它可能指代 1918 年的日期或 2018 年的日期。但是,如果您知道所有日期都指代1900 年代,那么在给定两位数年份的情况下,如下代码是可行的:
<?php
$now = new DateTime();
$formatted = "";
$arrFormattedBDays = [];
$birthdays = ['18-Jul-46','19-Aug-47','1-Jan-19','31-Dec-18'];
foreach ($birthdays as $b){
list($d,$m,$y) = explode("-",$b);
$y = '19'.$y;
$dt = new DateTime("$d-$m-$y");
$formatted = $dt->format('d/m/Y');
$arrFormattedBDays[] = $formatted;
}
var_dump($arrFormattedBDays);
Output:
array(4) {
[0]=>
string(10) "18/07/1946"
[1]=>
string(10) "19/08/1947"
[2]=>
string(10) "01/01/1919"
[3]=>
string(10) "31/12/1918"
否则,默认情况下,DateTime 创建一个基于当前年份的日期对象,您可以根据您想要永久保存的真实情况对其进行格式化;参见 here. Note: if you know that the dates all occur in the 20th century, i.e. 1901-2000, then you may amend this code by adding in a little logic; see here。
PHP v 5.6.2
我需要将诸如 18-Jul-46 之类的日期转换为 18/07/1946 并且没有多少 DateTime 函数可以正常工作。 (因为 strtotime 不适用于 1970 年之前的日期)。他们最终都给出了 18/07/2046,这是不正确的。
到目前为止我尝试过的代码:
$date = new DateTime("18-Jul-46");
$date->format('d/m/Y');
另一个带日期时间
$date = DateTime::createFromFormat('d-M-y', "18-Jul-46");
$date->format('d/m/Y');
之前也试过,
$date = date('d/m/Y', strtotime('18-Jul-46'));
None 给了我正确的格式。感谢任何指点或帮助。
提前致谢!
计算机不知道你是指 2000 还是 1900。你可以只取年份的最后 2 位数字,然后在前面加上“19”,例如:
$date = new DateTime("18-Jul-46");
$date->format('d/m/19y');
如果您也想使用 2000,此代码将使用最接近 1970 的数字
$date = new DateTime("18-Jul-20");
$date->format('d/m/Y');
$t1 = $date->format('19y');
$t2 = $date->format('20y');
if(abs(1970-$t1)<abs(1970-$t2))
echo $t1; //Take the 19.. one
else
echo $t2; //Take the 20.. one
但最后,你不能确定 2030 年是否正确。
如果您有诸如“31-Dec-18”之类的日期,则它是不明确的,因为它可能指代 1918 年的日期或 2018 年的日期。但是,如果您知道所有日期都指代1900 年代,那么在给定两位数年份的情况下,如下代码是可行的:
<?php
$now = new DateTime();
$formatted = "";
$arrFormattedBDays = [];
$birthdays = ['18-Jul-46','19-Aug-47','1-Jan-19','31-Dec-18'];
foreach ($birthdays as $b){
list($d,$m,$y) = explode("-",$b);
$y = '19'.$y;
$dt = new DateTime("$d-$m-$y");
$formatted = $dt->format('d/m/Y');
$arrFormattedBDays[] = $formatted;
}
var_dump($arrFormattedBDays);
Output:
array(4) {
[0]=>
string(10) "18/07/1946"
[1]=>
string(10) "19/08/1947"
[2]=>
string(10) "01/01/1919"
[3]=>
string(10) "31/12/1918"
否则,默认情况下,DateTime 创建一个基于当前年份的日期对象,您可以根据您想要永久保存的真实情况对其进行格式化;参见 here. Note: if you know that the dates all occur in the 20th century, i.e. 1901-2000, then you may amend this code by adding in a little logic; see here。