【问题标题】:PHP strtotime() setting date to defaultPHP strtotime() 将日期设置为默认值
【发布时间】:2012-11-19 13:43:31
【问题描述】:

我有一个脚本,它从 excel 表中读取值并将它们插入到 sql 表中。我的问题是,当脚本读取某些日期字段时,会将它们设置为默认值:1970-01-01 01:00:00

我注意到当遇到“天”大于 12 的日期时会发生这种情况:13/05/2012 18:52:33 (dd-mm-yyyy hh-mm-ss)

我认为这可能是由于脚本认为这是月份字段(即美国格式)并且它认为它是无效值,所以我将默认时区设置为我自己的希望它可以解决问题但是它没有任何区别。 date_default_timezone_set('Europe/Dublin');

这是我的代码正在执行的示例:

Excel 字段值:

01/05/2012 18:32:45

脚本:

$start_time  = $data->val($x,5);
echo $start_time = date("Y-m-d H:i:s", strtotime($start_time));

输出:

2012-01-05 18:32:45

这是我正在寻找的确切格式(除了日期和月份字段被切换的事实,即美国日期格式),但它不适用于我上面提到的日期类型。

【问题讨论】:

    标签: php excel date format strtotime


    【解决方案1】:

    使用DateTime 对象可能是您的解决方案。你可以做

    $dt = DateTime::createFromFormat("d/m/Y H:i:s", $data->val($x,5););
    echo $dt->format('Y-m-d H:i:s');
    

    然后选择你想要的格式。

    【讨论】:

    • 您好,感谢您的回复。尝试了您的建议,但结果如下: 2013-05-01 18:52:33 for the date 13/05/2012 18:52:33
    • @Paddyd createFromFormat 类似于date_parse_from_format(),因此您需要将格式更新为d/m/Y H:i:s
    • @TimLytle 谢谢,我刚刚编辑了代码以更新格式。
    【解决方案2】:

    这应该可以为您完成工作:

    // example datetime
    $orig_date = '13/05/2012 18:52:33';
    // split date & time into array
    $date_time = preg_split('/\s+/', $orig_date);
    // date in array formated as ddmmyyyy
    list($d, $m, $y) = preg_split('/\//', $date_time[0]);
    // date re-formated as yyyy-mm-dd for MySQL
    $new_date = sprintf('%4d-%02d-%02d', $y, $m, $d);
    // And add time on again with a space for MySQL datetime format
    echo $new_date.' '.$date_time[1];
    

    【讨论】:

      【解决方案3】:

      根据strtotime() 的注释,该函数假定/ 分隔的日期为m/d/y- 分隔的日期为d-m-y

      您可以替换日期字符串中的斜杠,或者如果您使用的是 5.3 或更高版本,请使用 date_parse_from_format(),并直接提供格式。

      作为mentioned by jaudette,您也可以使用DateTime::createFromFormat(),获取对象而不是时间戳。

      【讨论】:

      • 谢谢,我现在试试这个,告诉你进展如何
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多