我的一些使用strftime()函数的代码表现出奇怪的行为

4
我从数据库中获取了一些日期,并使用PHP的strftime格式化它们。现在,一切都按预期工作,但是如果我使用%A格式,这应该给我完整的星期几名称,该函数返回空值,除非日期恰好是周末,在这种情况下,它正确地返回“Saturday”或“Sunday”。所有其他格式都有效,甚至包括%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,第二个回声除非$row['date']落在星期六或星期日,否则返回NULL。
如果这可能有所帮助,代码位于一个类中,但我看不出这可能会影响结果...
编辑2:这不是数据库或日期格式的问题,否则第一个回声就不会起作用。而且,我可以删除数据库代码,使用mktimestrtotime生成日期,仍然无法工作。
编辑3(解决方案):找到了问题。在意大利语中,星期几的名称以ì结尾(例如lunedì),除了星期六和星期日外,它们没有重音字母。操作的结果传递给json_encode,它显然不喜欢重音字符...调用utf8_encode(或htmlentities)解决了问题。

你真的应该在这里发布代码和失败的时间戳。 - JohnP
问题:为什么不使用date(),甚至更好的datetime类?你可以尝试两者并查看是否获得所需的输出。 - Poelinca Dorin
1
@nico,你能运行一下“strftime”手册页面上的第四个示例(http://us2.php.net/manual/en/function.strftime.php#example-637),并在你的问题中提供输出结果吗?strftime依赖于底层的C库来提供格式化功能,所以也许这是底层服务器的问题,而不是PHP本身的问题。 - Charles
1
@Col.: 感谢您的评论,但没有人强迫您回答,所以如果您认为我的问题不符合您的标准,只需按一下浏览器窗口右上角的X即可解决问题。 - nico
9
@Col. Shrapnel: 旗帜是怎么回事?这个问题不是垃圾邮件,它确实属于这里,并且尽管可能达不到标准,我怀疑这不是SO上最差的被接受的问题。您有投票表达异议的权利。 - Joris Meys
显示剩余10条评论
2个回答

4
根据手册:http://php.net/manual/en/function.strftime.php,如果你传递的不是时间戳,那么你就错了。无法解释为什么第一个可以通过而第二个不行。也许PHP正在尝试弥补这个问题。无论如何,如果你有一个文本时间表示,你需要先对其调用strtotime()编辑 我在我的系统中运行了以下代码。
$row['date'] = '2011-04-06 08:33:29';
echo strftime("%a %H:%M", $row['date']);
echo '<br>';
echo strftime("%A %H:%M", $row['date']);

我得到了这个输出结果。
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

您的系统应启用通知。将其更改为时间戳即可解决问题。

编辑2

...此外,我可以删除DB代码, 并使用mktime或strtotime生成日期,但仍然无法正常工作。

如果您可以发布无法正常工作的示例,我们可以查看一下。


好的...我似乎已经解决了这个问题,虽然我仍然找不到问题所在。如果我将代码拿出类之外,它可以完美地工作,如果我将其留在类中,则无法工作...我将进行更多测试,并在有更具体结果时发布更新。非常感谢您的帮助。 - nico
好的,错误的一部分是日期格式。现在如果我保持英语区域设置,它可以工作。然而,当我使用意大利语区域设置时,我又回到了旧问题。我会将您的答案标记为已接受,并尝试找出具体的问题所在。感谢您抽出时间来回答。 - nico
是的,我认为那就是问题所在(例如日期格式可能是日/月/年或者年/月/日等)。我今晚会尝试解决这个问题。 - nico
找到了问题。在意大利语中,除了星期六和星期天外,每天的名称都以 ì 结尾(例如:lunedì)。操作的结果被传递给了 json_encode,它显然不喜欢带重音符号的字符... 调用 htmlentities 解决了这个问题。 - nico
你可能想把那一部分作为答案发布。这将有助于任何遇到相同问题的人 :) - JohnP
显示剩余3条评论

3

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

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

为什么周六和周日会起作用呢?PS:strtotime不幸不能解决这个问题...但还是谢谢你指出了错误的参数。 - nico
好吧,这是未定义的行为。它可能会格式化您的硬盘,但仍符合规范。这不是很好,但它不违反规范 :-) - Sander Marechal
没问题,对我来说无所谓,我不是服务器的所有者! :P - nico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接