我有一个脚本,它从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
这是我正在寻找的确切格式(除了日期和月份字段切换的情况,即美国日期格式),但它不适用于我上面提到的日期类型。
答案 0 :(得分:1)
根据strtotime()
上的注释,该函数假定/
分隔的日期为m/d/y
,而-
分隔的日期为d-m-y
。
您可以替换日期字符串中的斜杠,或者如果您使用的是5.3或更高版本,请使用date_parse_from_format()
,并直接提供格式。
作为mentioned by jaudette,您还可以使用DateTime::createFromFormat()
,并获取对象而不是时间戳。
答案 1 :(得分:1)
使用DateTime
对象可能是您的解决方案。你可以做到
$dt = DateTime::createFromFormat("d/m/Y H:i:s", $data->val($x,5););
echo $dt->format('Y-m-d H:i:s');
并选择所需的格式。
答案 2 :(得分:1)
这应该适合你:
// 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];