我想获取指定日期格式的零填充日期字符串。如果外部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时,我希望以新方式格式化零。
可能没有简单的方法来格式化日期的“零字符串”,但也许来自这个伟大社区的人有更好的想法? :)
答案 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返回值,一般情况下,如果我按条件查找日期,请返回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
)的格式元素时,这可能会变得混乱。就个人而言,我可能会选择一个默认格式并使用它,就像你问题中的代码所示。