php版的mysql的str_to_date()

时间:2011-03-23 14:52:16

标签: php mysql date-parsing

我在我的公司代码库中遇到过这种情况,我想把它更改为只连接到mysql的东西:

$sql = "select date_format(str_to_date('$date','$format'),'%Y-%m-%d') startDate ";
$result = mysql_query($sql);
...

我们的生产环境属于unix种类,我的开发环境也是如此,但是有些人在Windows环境中编写代码,因此strptime()不是一种选择。

我已经看到类似的问题浮现在SO,但没有一个答案符合我的需求。是否有一种简单或常用的方法可以使用变量格式从字符串中提取日期?

日期格式变化如此之大的原因是因为我们正在解析供应商的文件名,所以我们必须能够处理yyyymmdd,mmddyyyy,ddmmyyyy,ddmonyyyy等等。

2 个答案:

答案 0 :(得分:1)

PHP函数strtotime() PHP Ref将大多数字符串转换为时间戳(包括“下周四”之类的字符串)到时间戳,但即使在处理欧洲和美国日期结构(“dd / mm / yyyy”与“mm / dd / yyyy”)。

您可以在http://www.functions-online.com/strtotime.html

进行测试(无需编写测试脚本)

答案 1 :(得分:1)

简短的回答是,无法自动解析任意日期格式,这些日期格式将正确解析所有格式。在您自己的示例格式中,无法知道哪个数字用于哪个日期增量。

您可以查看strtotime()的可接受格式,如果您的所有供应商都使用其识别的格式,那么您很幸运。但如果没有,你真正做的最好的事情是创建一个"vendor" => "format"的查找表,然后你可以使用date_parse_from_format()

编辑 *基于以下评论,这里是一个php4版本的date_parse_from_format()近似值,可以满足您的需求*

function date_parse_from_format($format, $date) {
  $dMask = array('H'=>'hour','i'=>'minute','s'=>'second','y'=>'year','m'=>'month','d'=>'day');
  $format = preg_split('//', $format, -1, PREG_SPLIT_NO_EMPTY);  
  $date = preg_split('//', $date, -1, PREG_SPLIT_NO_EMPTY);  
  foreach ($date as $k => $v) {
    if ($dMask[$format[$k]]) $dt[$dMask[$format[$k]]] .= $v;
  }
  return $dt;
}

基本上你需要有一个vendor => format的查找表,其中format是日期字符串中每个字符所代表的掩码。

注意:用于每个日期/时间增量的掩码并不完全反映php的普通date()字符串格式中使用的掩码。它被简化并意味着屏蔽自定义字符串的每个字符。

示例:

/*
  lookup table for vendors
  for EVERY character you want to count as a date/time 
  increment you must use the following masks:
  hour   : H
  minute : i
  second : s
  year   : y
  month  : m
  day    : d
*/
$vendorDateFormats = array(
  'vendor1' => 'yyyymmdd',
  'vendor2' => 'mmddyyyy',
  'vendor3' => 'ddmmyyyy',
  'vendor4' => 'yyyy.mm.dd HH:ii:ss'
);

// example 1:
echo "<pre>";
print_r(date_parse_from_format($vendorDateFormats['vendor2'],'03232011'));

// example 2:
echo "<pre>";
print_r(date_parse_from_format($vendorDateFormats['vendor4'],'2011.03.23 12:03:00'));

输出:

Array
(
    [month] => 03
    [day] => 23
    [year] => 2011
)

Array
(
    [year] => 2011
    [month] => 03
    [day] => 23
    [hour] => 12
    [minute] => 03
    [second] => 00
)