0

我有这段代码,这在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') 但这对我不起作用。

对这种奇怪的行为有什么想法吗?

注意:对于我的服务器的 PHP 信息

4

1 回答 1

0

您是否在脚本之前设置了 date_default_timezone_set?

正如 php 文档中所建议的那样:

为了避免令人沮丧的混淆,我建议在使用 strtotime() 之前始终调用 date_default_timezone_set('UTC')。

因为 UNIX 纪元始终是 UTC;如果您不这样做,您很可能会输出错误的时间。

干杯

如果你这样做了,也许你能检查一下输出什么,一般来说,另一个日期?

例如:

$listdate = date("Y-m-d",strtotime("now"));

另外,mktime对你有用吗?

评论后编辑:

似乎您不是唯一遇到 PHP 5.3 此类问题的人,事实上,总是从文档中,用户遇到类似的情况并为 Windows 平台提供了解决方案:

这里的大多数脚本都依赖于 PHP 在未设置区域时识别正确的区域,但这并不总是发生。

例如,PHP 5.3.3 为检测到的 '8.0/no DST' 给出了 '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+ 中设置

主题链接:http ://www.silverstripe.org/installing-silverstripe/show/15398?start=8

所以,请尝试将 date.timezone 添加到您的 PHP.ini 中!

其他更新(总是在更多评论之后):

由于您的代码在解析日期时有效,因此请使用日期解析器或尝试以下操作:

<?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

如果这仍然不起作用,请按照此处的建议使用日期时间或日期解析器...

最后和最后的编辑:

用 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');
?>
于 2013-09-10T07:31:51.970 回答