显示1800年之前的过去日期

时间:2010-10-21 08:56:10

标签: mysql datetime

我有一个历史事件系统。它使用此

显示日期
    date("j F, Y", strtotime($row['dated']));

但是当我尝试:21 Oct 1877时,它会显示31 December, 1969

如何解决此问题?

5 个答案:

答案 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,我建议使用DATEDATETIME类型来表示日期/日期和时间,因为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');

从这里http://www.php.net/manual/en/datetime.format.php

答案 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

但是:另外,您可以让数据库为您设置日期格式,因此您只需要输出结果 - 我认为这将是最好的主意(我不知道语法不在我的脑海中,请谷歌查询)