【问题标题】:PHP : Weird Output with strtotimePHP:奇怪的输出与 strtotime
【发布时间】:2013-09-10 06:54:22
【问题描述】:

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

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

注意:For PHP Info of my server

【问题讨论】:

  • 你检查过 $listdate 的值吗,我的意思是如果它在传递给日期函数之前被替换为正确的格式
  • @Deepanshu 是的,我已经检查过了。
  • @ravisoni 您的代码已为我签出。您是否绝对肯定您发布的内容实际上是您正在使用的实际代码?
  • 我从抓取这个网站中得到了 $str :breitlingsource.com/phpBB2/…,我在回显它之后写了这个字符串。

标签: php strtotime


【解决方案1】:

您是否在脚本之前设置了 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');
?>

【讨论】:

  • 当我陷入这种情况时,我首先尝试了 date_default_timezone_set('UTC') 但这没有帮助。
  • 好的,在我的电脑上尝试,在 Windows 中,你的功能确实有效。但是,请检查一下:由于您使用的是 PHP 5,因此请尝试更改您的 PHP.ini 配置。从文档中:“除了使用此函数 (date_default_timezone_set) 在脚本中设置默认时区,您还可以使用 INI 设置 date.timezone 来设置默认时区。”。看看这个:php.net/manual/en/datetime.configuration.php#ini.date.timezone。因此,请尝试从您的 PHP.ini 文件中更改时区,如果这可行,请告诉我们,也许这会解决它!
  • 此外,也请查看:stackoverflow.com/questions/10289214/…。也许您的问题与您的 PHP 版本和服务器有关!
  • 当我简单地使用这个字符串 Thu Sep 05, 2013 3:40 pm 时,它可以完美地工作而无需设置任何时区。
  • 有趣。 $listdate = preg_replace('/Posted: /','',$str ); 是什么意思?输出给你?你试过修剪吗? : $listdate = trim(preg_replace('/Posted: /','',$str));另外,strotime($listdate) 应该是 1378388400!
猜你喜欢
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
相关资源
最近更新 更多