您是否在脚本之前设置了 date_default_timezone_set?
根据 php 文档的建议:
为避免令人沮丧的困惑,我建议您始终致电
使用 strtotime() 之前的 date_default_timezone_set('UTC')。
因为 UNIX 纪元始终采用 UTC;你很可能会输出
如果你不这样做是错误的时间。
干杯
如果你这样做了,也许你能检查一下输出什么,一般来说,另一个日期?
例如:
$listdate = date("Y-m-d",strtotime("now"));
另外,mktime 是否适合您?
在 cmets 之后编辑:
似乎您不是唯一一个在使用 PHP 5.3 时遇到此类问题的人,事实上,总是从文档中,用户遇到类似的情况并给出了针对 windows 平台的解决方案:
这里的大部分脚本都依赖于 PHP 识别正确的区域
当一个未设置时,但这并不总是发生。
例如,PHP 5.3.3 为检测到的“8.0/否”提供“UTC”结果
夏令时'。帮助不大。
所以对于我们这些有充分理由真的无法设定时间的人来说
.ini 文件的脚本中的区域,这是一个用于
将默认时区设置为操作系统时间的 Windows 环境
区域并返回检测到并设置的文本。
<?php
function date_system_timezone_set(){
$shell = new COM("WScript.Shell") or die("Requires Windows Scripting Host");
$time_bias = -($shell->RegRead(
"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control
\\TimeZoneInformation\\Bias"))/60;
$ab = -($shell->RegRead(
"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control
\\TimeZoneInformation\\ActiveTimeBias"))/60;
$sc = $shell->RegRead(
"HKEY_USERS\\.DEFAULT\\Control Panel\\International\\sCountry");
foreach(timezone_abbreviations_list() as $tza) foreach($tza as $entry){
$country = strtok($entry['timezone_id'],'/');
$locale = strtok('|');
if($country==$sc && $ab==($entry['offset']/60/60) && ($ds = $time_bias!=$ab)==$entry['dst']){
date_default_timezone_set($timezone_identifier = $country."/".$locale);
return sprintf('%.1f',$ab)."/".($ds?'':'no ').'DST'." ".$timezone_identifier;
}
}
return false;
}
?>
另外,在谷歌上搜索,在 maaaaaaaaaany 搜索之后,我发现很多人说在 PHP 5+ 中你必须在 PHP.ini 中定义 date.timezone!
来自论坛:
php.ini 中的 date.timezone 选项必须在 PHP 5.3.0+ 中设置
Topi 链接:http://www.silverstripe.org/installing-silverstripe/show/15398?start=8
所以,请尝试将 date.timezone 添加到您的 PHP.ini 中!
其他更新(总是在更多 cmets 之后):
如果您解析日期,您的代码可以正常工作,请使用日期解析器或尝试以下操作:
<?php
$str = 'Posted: Thu Sep 05 2013 3:40 pm ';
$listdate = preg_replace('/Posted: /','',$str );
$listdate = date('Y-m-d',strtotime($listdate));
echo $listdate;
?>
这与我相呼应 2013-09-05
如果这仍然不起作用,请按照建议使用 datetime or date parsers here...
最后和最后的编辑:
在我的 crunchbang linux 上用 php 5 试过这段代码,它确实有效:
<?php
$str = 'Posted: Thu Sep 05, 2013 3:40 pm ';
$listdate = preg_replace('/Posted: /','',$str );
$date = date_create_from_format('D M j, Y g:i a ', $listdate);
echo date_format($date, 'Y-m-d');
?>