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

php-使用不同格式统一日期字符串,php,date,Php,Date,我有一个包含许多不同日期格式的数组。所有字符串 我想把它统一成一个带有日期()的数组。大概是这样的: 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) );

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

我想把它统一成一个带有日期()的数组。大概是这样的:

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] => 
)

有什么方法可以对所有格式进行转换吗?

不幸的是,我认为您必须检测自己的格式,然后将其转换为您希望的格式…
真正的问题是几个月和几天
一些国家使用
2014年12月31日
,其他国家使用
2014年12月31日

因此,您必须在字符串中定义月份和日期,如
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不是有效日期)

你也可以在谷歌上找到一些带有“日期模式正则表达式”的函数,例如…

你可以使用这个函数。拨弄

注意,它应该是前几天的,而不是前几个月的。否则就不可能知道日期的前半部分是一天还是一个月(除非这一天超过12天,并且不能涵盖所有情况)

函数date2time($date)
{
$date=str_替换(“”,,$date);
if(strpos($date,'-')!==false)
$date_数组=分解('-',$date);
if(strpos($date,“/”)!==false)
$date_数组=分解('/',$date);
//如果需要,添加更多分隔符
$day=$month=$year='';
foreach($date\u数组作为$date\u元素)
{
如果(strlen($date\u elem)<3)
{
如果(空($天))
$day=$date\u elem;
其他的
$month=$date\u elem;
}否则
$year=$date\u elem;
}
$time=mktime(0,0,0,$month,$day,$year);
返回$time;
}
$arr=数组(
'07/29/1975',
'20/01/1981',
'1983-05-24',
'10 /8 /1995'
);
打印(数组映射('date2time',$arr));

前两个字符串使用
/
作为组件分隔符。函数认为它们是按照:<代码>月/日/年< /代码>进行格式化的。由于
24
20
是无效的月数,因此无法正确解析它们

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

正如函数
strotime()
中的注释所述:

注意:
通过查看各个组件之间的分隔符,可以消除
m/d/y
d-m-y
格式中的日期歧义:如果分隔符是斜杠(
/
),则假定为美式
m/d/y
;而如果分隔符是破折号(
-
)或点(
),则假定为欧洲
d-m-y
格式

你能做什么 如果您知道日期中组件的顺序,您可以始终使用
/
表示
m/d/y
(美国格式)和
-
表示
d-m-y
(欧洲格式)。此外,还应去除空间


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

有关如何检测格式的示例?也许使用正则表达式?如果您不知道日期的格式,PHP几乎帮不了您。说真的,第一步是确保你定义并知道日期的格式。否则,您将不得不编写一系列启发式方法来处理此问题。您能否提供必须格式化的日期类型?这样我就可以帮助您使用str_replace将其整个第一个参数用作分隔符。您需要使用才能仅使用“-”、“/”、“.”中的一个作为分隔符拆分字符串。
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) );