日期时间不适用于1970年之前的日期

时间:2019-01-08 18:17:40

标签: php date datetime strtotime

PHP v 5.6.2

我需要转换日期(例如46-Jul-46)给我18/07/1946,并且没有足够的DateTime函数正常工作。 (因为strtotime不适用于1970年之前的日期)。他们最终都给出了20/07/1846这是不正确的。

到目前为止我尝试过的代码:

$date = new DateTime("18-Jul-46");
$date->format('d/m/Y');

另一个带有DateTime的

$date = DateTime::createFromFormat('d-M-y', "18-Jul-46");
$date->format('d/m/Y');

早期也尝试过

$date = date('d/m/Y', strtotime('18-Jul-46'));

他们都没有给我正确的格式。任何指针或帮助,表示赞赏。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您有一个日期,例如'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。注意:如果您知道所有日期都发生在20世纪,即1901-2000,那么您可以通过添加一些逻辑来修改此代码;参见here

答案 1 :(得分:0)

计算机不知道您表示的是2000还是1900。您可以只输入年份的后两位数字,并在前面加上“ 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年是否正确。