我有一个历史事件系统。它使用此
显示日期 date("j F, Y", strtotime($row['dated']));
但是当我尝试:21 Oct 1877
时,它会显示31 December, 1969
。
如何解决此问题?
答案 0 :(得分:3)
您可以要求MySQL以您希望的方式格式化日期,这样您就不必将格式化日期转换为时间戳,然后再转换回格式化日期。
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format
答案 1 :(得分:2)
问题是,strtotime
将日期转换为unix_timestamp,这是自1970-01-01 00:00:00 UTC以来的秒数。在unix_timestamp'0'上,它仍然是1969年12月31日在美国。
就像@Dan Grossman告诉你的那样,尝试直接从MySQL获得正确的格式。例如:
SELECT DATE_FORMAT(dated, '%d %M, %Y')
FROM history
答案 2 :(得分:1)
由于您标记了此MySQL,我建议使用DATE
或DATETIME
类型来表示日期/日期和时间,因为UNIX时间戳具有严重的范围限制(只能表示日期) 1901年至2038年之间,而不是DATE
的1001-9999年。
Straight from the manual page of strtotime:
注意:
时间戳的有效范围是 通常来自1901年12月13日星期五 20:45:54 UTC到2038年1月19日星期二 03:14:07 UTC (这些是日期 对应于最小值和 32位有符号的最大值 整数。)另外,不是全部 平台支持负时间戳, 因此你的日期范围可能是 限于不早于Unix 时代。这意味着,例如日期 在1970年1月1日之前将不会工作 Windows,一些Linux发行版,以及 一些其他操作系统。 PHP 5.1.0和更新的版本克服了这个限制。
换句话说,UNIX时间戳是一个带符号的32位整数,因此只能表示cca 137年跨度(1901-2038)。如果你想在PHP中这样做,你应该看看Calendar函数。
可能更好的解决方案是使用MySQL的DATETIME
类型(而不是您似乎使用的任何字符串类型),并使用DATE_FORMAT()
格式化日期。
另请注意,各个国家已在不同时间切换到今天最常见的公历 - 例如俄罗斯在19世纪仍在使用朱利安历法(两者之间有几天的差异)。
答案 3 :(得分:1)
使用
$date = new DateTime($row['dated']);
echo $date->format('Y-m-d H:i:s');
答案 4 :(得分:0)
Piskvor和eumiro描述了为什么会这样,所以我不再重复。您可以做什么来避免这种情况就是编写自己的litte函数来格式化日期 - 只需使用explode来获取日期的所有部分并从这些部分重建needet格式,如下所示:
list($year,$month,$day,$hour,$minute,$second) = explode('-',str_replace(array(' ',':'),'-',$row['dated']);
$output = "$day $month, $year";
这不是完美的喷射,它输出日期作为数字 - 但你明白了(你可以使用数组存储月份名并输出$monthname[$month]
而不是$month
)
但是:另外,您可以让数据库为您设置日期格式,因此您只需要输出结果 - 我认为这将是最好的主意(我不知道语法不在我的脑海中,请谷歌查询)