如何将未来日期转换为匹配的时间戳

时间:2010-09-20 15:55:54

标签: php date

我有一个函数,它采用08/24/2010格式的字符串日期并将其转换为时间戳。我遇到的问题是08/24/2090之类的日期转换不正确。

这是我的功能:

/**
* Converts a date to a timestamp
* for a date formatted such as: 08/24/2010 12:00:00, 08-24-2010 12:00:00 or 08/24/2010
* 
* @param string date
* @return string
*/
public static function dateToTimeStamp($date)
{
    if (!strstr($date, ' ')) $date .= ' ' . date('h:i:s');
    list($date, $time) = explode(' ', $date);
    list($month, $day, $year) = (strstr($date, '/') ? explode('/', $date) : explode('-', $date));
    list($hour, $minute, $second) = explode(':', $time);

    $timestamp = mktime($hour, $minute, $second, $month, $day, $year);
    return date('Y-m-d h:i:s', $timestamp);
} 

我刚刚在09/30/2090过去了,我回到1969-12-31 04:00:00但是当我在09/30/2020过去时,我回来了2020-09-30 08:54:44

2 个答案:

答案 0 :(得分:2)

strtotimemktimeY2038 bug影响。 Unix时间戳计算自1970年1月1日以来的秒数,如果它使用32位整数,则该整数将在2038年1月19日溢出,这将导致PHP不知道如何解析日期。

  

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

尽管手册中的警告显示,但使用mktimestrtotime时,5.1版之后的PHP仍会受到2038错误的影响。然而,DateTime类克服了这个错误,应该使用它。

public static function dateToTimeStamp($date)
{
  if (!strstr($date, ' ')) $date .= ' ' . date('h:i:s');
  $d = new DateTime($date);
  return $d->format('Y-m-d h:i:s');
}

请注意,PHP 5.2中添加了DateTime

答案 1 :(得分:2)

如果您需要的日期超出了Unix时间戳的32位范围,那么您应该开始使用PHP datetime object,它会为您提供一个早于大爆炸的日期范围,并且可能甚至比烧录时间更长 - 在阳光下