1

我想为指定的日期格式获取用零填充的日期字符串。我想在外部 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 时,我希望以新的方式格式化零。

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

4

2 回答 2

2

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

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

我问的零是不好的,因为如果您通过某些 API 将这样的零发送到任何客户端(例如移动应用程序),它就没有机会解析它 - 它会使应用程序崩溃而不会捕获错误。

而不是使用零日期表示:

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

通常,如果我像示例中那样按条件查找日期,我会返回 false,并且每个使用此 API 的客户端都对此感到满意:

if(empty($date)){return false;}
于 2013-04-28T00:45:57.407 回答
0

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

但是,您可以通过为每个合理的格式字符定义绝对值并使用strtr()将它们转换为它们的特定值来做到这一点。

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

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

return strtr(DATE_FORMAT, $placeholders);

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

于 2013-04-10T14:53:02.993 回答