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"

live code

否则,默认情况下,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