2012-12-01 126 views
1

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

我注意到这是发生在'date'大于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 

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

回答

1

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

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

并选择你想要的格式。

+0

您好,感谢您的答复。尝试了你的建议,但它给了以下结果:2013-05-01 18:52:33日期13/05/2012 18:52:33 – Paddyd

+1

@Paddyd'createFromFormat'类似于'date_parse_from_format()',所以你需要将格式更新为'd/m/YH:i:s'。 –

+0

干杯蒂姆,改变了格式,它的工作完美! – Paddyd

1

从上strtotime()笔记,功能假定由/分隔日期是由-分隔m/d/y和日期d-m-y

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

而作为mentioned by jaudette你也可以使用DateTime::createFromFormat(),并获得一个对象,而不是一个时间戳。

+0

谢谢,我现在就试试这个,让你知道如何去 – Paddyd

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];