如何在MongoDB中处理低于1970年的日期

时间:2013-05-29 09:00:12

标签: php mongodb

我有一个带有“生日”字段的文档,其值也可以低于01-01-1970。我怎么处理这个? E.g。

{....
    'birthday' => newMongoDate(strtotime('31/10/1968')),
 ....
}

这会创建一个“生日”值:“1/1/1970 12:00:00 AM”(日期时间)

3 个答案:

答案 0 :(得分:3)

您运行的是哪个版本的PHP?我猜PHP< 5.1在Windows上? strtotime()的日期范围应为格林威治标准时间1901年12月13日20:45:54 GMT和Tue,2038年1月19日03:14:07 GMT,PHP 5.1及更高版本。

对于PHP 5.2及更高版本,您可以使用:

$date = new DateTime('1 Jan 1950');
echo $date->format('Y-m-d');

,或者

$date = DateTime::createFromFormat('d M Y','1 Jan 1950');
echo $date->format('Y-m-d');

答案 1 :(得分:0)

这是因为UNIX时间戳从1970年(http://php.net/manual/en/function.strtotime.php)开始,这是strototime计算的地方。尽管strtotime可以从1901年开始,但请注意:

  

时间戳的有效范围通常是从星期五,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和更新的版本克服了这个限制。

因此,您很可能遇到系统根本不支持纪元之前的日期的问题。

您可以像@nick所说的那样使用DateTime()来代替,更具体地说是使用timestamp函数:http://www.php.net/manual/en/datetime.gettimestamp.php

答案 2 :(得分:-1)

我能想到的唯一选择是使用类似

的嵌套Date对象
birth_date : {
  year : 1968,
  month : 10,
  day : 31
}

当然会出现问题,但这是Windows用户的唯一选择。