php - 使用不同格式统一日期字符串

时间:2015-05-25 13:08:23

标签: php date

我有一个包含许多不同日期格式的数组。所有字符串。

我希望将其统一为带有dates()的数组。像这样:

function uniformize($str){
  $date = strtotime($str);
  return $date;
}

$arr = array(
  '07/29/1975',
  '20/01/1981',
  '1983-05-24',
  '10 /8 /1995'
  );

print_r( array_map('uniformize', $arr) );

但这仅适用于一种格式:

Array ( 
  [0] => 
  [1] => 
  [2] => 454215600 
  [3] => 
)

我有什么方法可以为所有格式做到这一点吗?

3 个答案:

答案 0 :(得分:1)

不幸的是,我认为您必须检测自己的格式,然后将其转换为您希望的格式...
真正的问题是几个月和几天...... 有些使用31-12-2014,其他国家/地区使用12-31-2014 ...
所以你必须在像05-06-2015 ...

这样的字符串中定义哪个月份和日期

编辑:

你有很多正则表达式... ... 我将其用于2015-12-31格式:

if(preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $yourDate, $split)) && (checkdate($split[2],$split[3],$split[1]))) {
    // do stuff where $split[1] is years, split[2] is month, and split[3] is day
}

然后你可以根据你改变顺序的每种格式进行调整......
checkdate检查它是否是一个有效日期(2015-52-38不是有效日期)
你也可以在google上找到一些" date pattern regex"例如......

答案 1 :(得分:1)

您可以使用此功能。小提琴here

请注意,它应该始终比前几个月都要好。否则,不可能知道日期的第一部分是一天还是一个月(除非那天超过12 ......并且不能涵盖所有情况)。

function date2time($date)
 {
    $date = str_replace(' ','',$date);
    if(strpos($date,'-')!==false)
      $date_array = explode('-',$date);
    if(strpos($date,'/')!==false)
     $date_array = explode('/',$date);
    //add more delimiters if needed

    $day = $month = $year = '';

   foreach($date_array as $date_elem)
   {
    if(strlen($date_elem) < 3)
    {
       if(empty($day))
         $day = $date_elem;
       else
         $month = $date_elem;

    }else
      $year = $date_elem;
   }


    $time = mktime(0,0,0,$month,$day,$year);

    return $time;
  }

$arr = array(
  '07/29/1975',
  '20/01/1981',
  '1983-05-24',
  '10 /8 /1995'
  );

print_r( array_map('date2time', $arr) );

答案 2 :(得分:1)

前两个字符串使用/作为组件分隔符。函数strtotime认为它们是根据American formatmonth/day/year格式化的。由于2420是无效的月份数,因此无法正确解析它们。

最后一个字符串('10 /8 /1995')看起来像一个短日期格式,但组件内的空格也使它无效。

正如函数strtotime()的{​​{3}}中的说明中所解释的那样:

  

注意:
  m/d/yd-m-y格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠(/),那么美国m/d/y是假定;而如果分隔符是短划线(-)或点(.),则假定为欧洲d-m-y格式。

你能做什么

如果您知道日期中组件的顺序,可以使用documentation始终使用/ m/d/y(美国格式)和- d-m-y (欧洲格式)。此外,你应该剥离空格。

另一种选择是编写自己的日期解析器来识别日期组件,然后使用str_replace()mktime()来获取日期。但是,如果日期同时包含1..12中的日期和月份,则无法检测到格式,必须假设(来自分隔符)。