Php 我的一些代码使用strftime()时的奇怪行为

Php 我的一些代码使用strftime()时的奇怪行为,php,time,Php,Time,我正在从数据库中提取一些日期,并使用PHPstrftime对它们进行格式化 现在,除了使用%A格式(应该给我完整的工作日名称)之外,所有操作都按预期进行,函数只返回NULL,除非日期恰好在周末,在这种情况下,它正确返回“星期六”或“星期日” 所有其他格式都可以工作,甚至%a(简短的工作日名称)。 它似乎不取决于我使用的区域设置,也不取决于日期的特定格式(如果我只在mktime上使用strftime,同样的问题也会发生 我唯一的想法是,在服务器端,这是一种不可思议的配置问题,但我想听听是否有人对此

我正在从数据库中提取一些日期,并使用PHP
strftime
对它们进行格式化

现在,除了使用
%A
格式(应该给我完整的工作日名称)之外,所有操作都按预期进行,函数只返回NULL,除非日期恰好在周末,在这种情况下,它正确返回“星期六”或“星期日”

所有其他格式都可以工作,甚至
%a
(简短的工作日名称)。 它似乎不取决于我使用的区域设置,也不取决于日期的特定格式(如果我只在
mktime
上使用
strftime
,同样的问题也会发生

我唯一的想法是,在服务器端,这是一种不可思议的配置问题,但我想听听是否有人对此有其他想法

编辑:一些代码,虽然它和我以前写的差不多

$id = (int)$_GET['event'];
$res = mysql_query("SELECT date FROM events WHERE event_id=".$id);
$row = mysql_fetch_array($res);

echo strftime("%a %H:%M", $row['date']);
echo strftime("%A %H:%M", $row['date']);
第一个回显工作正常,例如返回
Thu 15:30
,第二个回显返回NULL,除非
$row['date']
在周六或周日

如果这可能有帮助的话,代码在类中,但我看不出这会如何影响结果

EDIT2:这不是数据库或日期格式的问题,否则第一次回音将无法工作。此外,我可以删除数据库代码,然后使用
mktime
strottime
生成日期,但仍然无法工作


EDIT3(解决方案):发现了问题。在意大利语中,除了星期六和星期日没有重音字母外,一天的名称以ì结尾(例如lunedì)。操作结果被传递给
json_encode
,后者显然不喜欢重音字符…调用
utf8_encode
(或转到
htmlentities
)解决了问题。

在您的评论中,您说您的数据库包含日期,如
2011-04-06 08:33:29
。但是
strftime
的第二个参数应该是unix时间戳,如
1302766547
,即自
1970-01-01 00:00:00 GMT
以来的秒数。请尝试以下操作:

echo strftime('%a %H:%M', strtotime($row['date']));

根据手册:

如果您传递的不是时间戳,那么您就错了。无法真正说明为什么第一个传递而第二个不传递。可能PHP正在尝试进行补偿。在任何情况下,如果您有文本时间表示,则需要首先对其调用
strotime()

编辑

我在我的系统中运行了以下代码

$row['date'] = '2011-04-06 08:33:29';
echo strftime("%a %H:%M", $row['date']);
echo '<br>';
echo strftime("%A %H:%M", $row['date']);
您应该在系统上启用通知。将其更改为时间戳可以解决此问题

编辑2

…而且,我可以删除数据库代码, 并使用mktime或 有了strotime,它仍然没有 工作


如果你可以发布不起作用的示例,我们可以看一看

你真的应该在这里发布代码和失败的时间戳。如果它们在日期字段中,则使用db对它们进行格式化,如果mysql:date\u format()@nico,你能在你的问题中运行并提供输出吗?strftime依赖于底层的C库来提供格式,所以可能是底层服务器而不是PHP本身的问题。@Col:谢谢你的评论,但是没有人强迫你回答,所以如果你认为我的问题不符合你的标准,请按X键你的浏览器窗口的右上角,应该可以解决这个问题。@Schrapnel上校:国旗怎么了?这个问题不是垃圾邮件,它确实属于这里,虽然它可能不符合标准,但我怀疑这是否是最难接受的问题。你有票表达你的不同意见。为什么周六和周日有效?PS:
st很遗憾,rtotime
无法解决问题……但无论如何,感谢您指出了错误的参数。(PS:我没有收到任何通知,我确实有错误报告)我只有
错误报告=E\u ALL
。您可能已经关闭了通知。您提到在运行strftime()之前进行了一些区域设置修改),这可能会为您提供一些合理的默认设置。请尝试发布您(使用数据)所做的
strotime()
调用所以我们可以看一下……我似乎已经解决了这个问题,尽管我仍然找不到问题。如果我把代码放在类外,它工作得很好,如果我把它放在类中,它就不工作了……当我有更具体的东西时,我会做更多的测试并发布更新。非常感谢你的帮助。好的,部分错误是日期格式。现在,如果我将英语作为区域设置,它会起作用。但是,当我设置意大利区域设置时,我会返回到旧问题。我会将您的答案标记为已接受,并尝试找出具体问题。感谢您花时间回答。我认为由于Strotime希望使用美国英语时间格式,可能您的本地化正在搞乱它。在数据进入方法之前,请查看数据。很高兴提供帮助:)为什么星期六和星期天可以工作?PS:Strotime并不能解决问题,很不幸……但无论如何,感谢你指出了错误的论点。这是一种未定义的行为。它可以格式化你的硬盘,并且仍然符合规范。这不是很好,但不会违反规范:-)对我来说很好,我不是服务器的所有者!:P
Notice: A non well formed numeric value encountered in F:\webroot\utils\test.php on line 4
Thu 00:33

Notice: A non well formed numeric value encountered in F:\webroot\utils\test.php on line 6
Thursday 00:33