我有这个代码,这在code.org上工作正常但在我的服务器上这只是回显1970-1-1
<?php
$str = 'Posted: Thu Sep 05, 2013 3:40 pm ';
$listdate = preg_replace('/Posted: /','',$str );
$listdate = date('Y-m-d',strtotime($listdate));
echo $listdate;
我尝试过设置date_default_timezone_set('UTC'),但这对我没用。
对这种奇怪的行为有什么想法吗?
答案 0 :(得分:0)
您是否在脚本之前设置了date_default_timezone_set?
正如php文档中所建议的那样:
为避免令人沮丧的困惑,我建议您随时致电 使用strtotime()之前的date_default_timezone_set('UTC')。
因为UNIX Epoch始终是UTC;你最有可能输出 如果你不这样做,那是错误的时间。
干杯
如果你这样做了,也许可以检查输出通常是另一个日期?
E.G:
$listdate = date("Y-m-d",strtotime("now"));
另外,mktime对您有用吗?
评论后编辑:
看起来你并不是唯一一个遇到PHP 5.3问题的人,实际上,总是来自文档,用户经历了类似的事情并为Windows平台提供了解决方案:
这里的大多数脚本都依赖于PHP识别正确的区域 当一个没有设置,但并不总是发生。
例如,PHP 5.3.3为检测到的'8.0 / no提供了'UTC'结果 DST”。没什么帮助。
因此,对于我们这些非常好的理由真的无法设定时间的人 .ini文件的脚本中的区域,这里是一个用于a的函数 Windows环境,将默认时区设置为OS时间 区域并返回检测到的和设置的文本。
<?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 5.3.0 + 中设置php.ini中的date.timezone选项
链接到topi:http://www.silverstripe.org/installing-silverstripe/show/15398?start=8
所以,请尝试添加到PHP.ini date.timezone!
其他更新(总是在更多评论之后):
由于您的代码在解析日期时有效,请使用日期解析器或尝试:
<?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最后和最终修改:
使用php 5在我的crunchbang linux上尝试了这个代码,它确实有效:
<?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');
?>