2011-03-23 90 views
0

我已经遇到这个在我公司的代码库,我想改变它的东西,不连接到MySQL仅仅只是一个函数:PHP版本()

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

我们的产品env是unix系列,和我的开发环境一样,但有些人在windows环境下编写代码,所以strptime()不是一个选项。

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

的日期格式可以差别如此之大的原因是因为我们正在分析从供应商的文件名,所以我们必须能够处理年月日,月日年,DDMMYYYY,ddmonyyyy,等等,等等

+0

排序的副本的http://stackoverflow.com/questions/2891937/strtotime-doesnt-work-with-dd-mm- yyyy-format – Brad 2011-03-23 16:40:01

回答

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 
) 
+0

不幸的是,我们没有使用5.3,但是date_parse_from_format()恰恰是我正在寻找的函数的类型。谢谢。 http://us2.php.net/manual/en/datetime.createfromformat.php也链接到你发给我的链接上,如果我有一个更新的PHP版本,这会很有帮助。 – 2011-03-23 15:13:35

+0

啊那很烂。好的,看看编辑上面的php4版本,它应该适合你 – 2011-03-23 16:28:56

+0

非常聪明。再次感谢。 – 2011-03-23 16:56:15

1

有PHP函数strtotime()PHP Ref将大部分字符串转换成时间戳(包括像“下个星期四”之类的东西),但即使在处理欧洲和美国的日期结构(“dd/mm/yyyy”与“毫米/日/年“)。

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

+0

欧洲/美国的日期结构正是我为什么不能使用strtotime()的原因。例如,12112011是什么日期。 – 2011-03-23 15:11:37

+0

然后,我想你是坚持创建自己的函数来分割字符串,分析它来确定格式(或应用已知格式),将其改造成可预测的格式,然后解析它。另外,为了检查,你知道如果用斜线和美式分隔,如果用斜线分隔,strtotime()将采用欧洲标准?不要认为这是否有助于解决您的问题。 – 2011-03-23 15:27:12

+0

噢,解析像“12112011”这样的块实际上并不是可以通过编程方式解决的东西(除非有关于预期值的规则,然后您可以测试每个可能的值)。这实际上是你需要在事物的输入端修复(强制输入为指定格式)的东西。 – 2011-03-23 15:28:47