在PHP中为特定格式创建空日期

时间:2013-04-10 14:45:04

标签: php date datetime default date-format

我想获取指定日期格式的零填充日期字符串。如果外部API没有给出日期,我想使用它。

示例:

define('DATE_FORMAT', 'Y-m-d H:i:s');

[...]

$date = SomeExternalApi::get_date();

// if date is given it's simple
if(!empty($date)){
 $date_obj = DateTime::createFromFormat(SomeExternalApi::SOME_DATE_FORMAT, $date_string);
 return $date_obj->format(DATE_FORMAT);
}else{
  // SO UGLY BELOW! :( How to use DATE_FORMAT in this case?
  return '0000-00-00 00:00:00';
}

我不想像示例中那样对“零字符串”进行硬编码,因为当我更改DATE_FORMAT时,我希望以新方式格式化零。

可能没有简单的方法来格式化日期的“零字符串”,但也许来自这个伟大社区的人有更好的想法? :)

2 个答案:

答案 0 :(得分:2)

我的问题的最佳答案是:不要走这条路。

你永远不会需要零日期 - 这是非常罕见的。您可以找到它的唯一一个地方是数据库日期字段 - 如果没有日期,您将获得零格式。但是这将始终是相同的格式,因此您可以将其定义为常量并将条件定义为字符串。

我问的Zeros很糟糕,因为如果你通过某些API将这些零发送到任何客户端(如移动应用程序)它没有机会解析它 - 它会使应用程序崩溃而不会出现错误。

而不是使用零日期表示:

  • [保存时]将空字符串放入数据库中,您可以将日期字段设置为空字符串,这将变为零,使用UPDATE mytable SET date = "" WHERE id = 2;执行此操作,mytable.date字段是此示例中的MySQL时间戳,< / LI>
  • [获取]时,您将获得SELECT date FROM mytable WHERE id = 2;的零,因此在代码中将其定义为常量字符串0000-00-00 00:00:00并等于从db返回值,
  • [当API的响应]如果date为空则返回false而不是零。移动应用程序可以检查它是否为false并尝试在任何其他情况下解析它。这是保持空日期的最佳方式,并且通过任何语言检查任何格式都非常简单。比试图解析一些奇怪的零格式更简单。

一般情况下,如果我按条件查找日期,请返回false,并且使用此API的每个客户都对此感到满意:

if(empty($date)){return false;}

答案 1 :(得分:0)

PHP中的日期和时间用UNIX时间戳表示。这可能代表的可能日期范围无法表示32位系统上的时间戳'0000-00-00 00:00:00'(超过2000年前)。此外,实际创建表示此单个时间戳的DateTime可能毫无意义,它所代表的值是不变的。

但是,您可以通过为每个合理格式字符定义绝对值并使用strtr()将其转换为特定值来实现此目的。

使用示例输入格式的简短示例:

$placeholders = array(
    'Y' => '0000',
    'm' => '00',
    'd' => '00',
    'H' => '00',
    'i' => '00',
    's' => '00'
);

return strtr(DATE_FORMAT, $placeholders);

但是,当您处理表示文本元素(如D)的格式元素时,这可能会变得混乱。就个人而言,我可能会选择一个默认格式并使用它,就像你问题中的代码所示。