如何确定PHP的非标准化日期字符串集中是否存在日,月或年值?

问题描述

我有一组非标准的日期字符串,我试图确定它们中是否存在日,月或年值。集合中的某些日期有日,月和年,而其他日期可能只有年或只有年和月。

示例:
date('Y-m-d',strtotime('April 1982'))
返回:1982-04-01
预期结果:1982-04-00

date('Y-m-d',strtotime('1982'))
返回值:1982-08-11(月和日为当前日期)
预期结果:1982-00-00

编辑:
忘记理想的结果,因为我不再打算用00s来表示它们。我只是想确定标题中所暗示的字符串中是否存在日,月或年值。

解决方法

date_parse()函数适用于此问题。但是,我认为它有一个错误。如果一天不存在,则一天也将显示为1。请参见用户贡献的注释date_parse()

以下函数DateAnalysis尝试使用正则表达式消除这种情况:

function DateAnalysis($dateString){
  $components = date_parse($dateString);
  if($components['day'] === 1 AND 
    preg_match('~^1 |^01 |\-01$|\-1$~',$dateString) == 0){
    $components['day'] = false;
  }
  return $components;
}

可以找到更多的变体here

示例:

var_dump(DateAnalysis('April 1986'));

输出:

array(12) {
  ["year"]=>
  int(1986)
  ["month"]=>
  int(4)
  ["day"]=>
  bool(false)
  ["hour"]=>
  bool(false)
  ["minute"]=>
  bool(false)
  ["second"]=>
  bool(false)
  ["fraction"]=>
  bool(false)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(false)
}

我不知道日期字符串中日期显示方式的所有可能变化。必须根据需要扩展正则表达式。