0

我在我的公司代码库中遇到过这个问题,我想将它更改为不连接到 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 等。

4

2 回答 2

1

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

您可以在http://www.functions-online.com/strtotime.html上对其进行测试(无需编写测试脚本)

于 2011-03-23T14:59:10.020 回答
1

简短的回答是,没有办法自动解析可以正确解析所有格式的任意日期格式。在您自己的示例格式中,无法知道哪些数字对应于哪些日期增量。

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

编辑: *基于下面的评论,这里是 date_parse_from_format() 的近似值的 php4 版本,应该适合您的需求*

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其中格式是日期字符串中每个字符所代表的掩码。

注意:用于每个日期/时间增量的掩码并不完全反映 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
)
于 2011-03-23T15:01:59.373 回答