【问题标题】:DateTime not working for dates before 1970 [duplicate]DateTime 不适用于 1970 年之前的日期 [重复]
【发布时间】:2019-01-08 18:17:40
【问题描述】:

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'));

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

提前致谢!

【问题讨论】:

  • 尝试使用 4 位数的年份。任何 2 位数字都被视为 1970 年之后,即 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)。

标签: php date datetime strtotime


【解决方案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

【讨论】:

    【解决方案2】:

    计算机不知道你是指 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 年也是正确的。

    【讨论】:

    • 感谢您的回复!但是,我认为我不能盲目地将 19 添加到字符串中,因为我可能会处理从 2000 年代开始的日期,比如 2016 年,所以可能需要手动检查它是否在 1970 年之前?这一切似乎都是手动的,但如果是唯一的出路,那就可以了。
    • @user7616631 如果您的数据不可信,那么任何代码都不适合您
    • 您唯一能做的就是检查年份是否更接近特定年份(例如 1970 年),前 20 年或前 19 年
    • @user7616631 “我可能会处理从 2000 年代开始的日期,比如 2016 年” 那么您如何确定您的问题中的“18/07/2046”不正确?如果您有特定的逻辑要应用以了解这一点,那么您需要在代码中应用相同的逻辑。
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2023-03-16
    • 2011-07-02
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多