簡體   English   中英

php版的mysql的str_to_date()

[英]php version of mysql's str_to_date()

我在我的公司代碼庫中遇到過這個問題,我想把它改成只是函數而不能連接到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等等。

有一個PHP函數strtotime() PHP Ref將大多數字符串(包括“下周四”之類的字符串)轉換為時間戳,但即使在處理歐洲和美國日期結構時也會有些混淆(“dd / mm / yyyy“對比”mm / dd / yyyy“)。

您可以在http://www.functions-online.com/strtotime.html上測試它(無需編寫測試腳本)

簡短的回答是,沒有辦法自動解析任意日期格式,這將正確解析所有格式。 在您自己的示例格式中,沒有辦法知道哪個數字是哪個日期增量。

您可以查看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的普通日期()字符串格式中使用的掩碼。 它被簡化並意味着屏蔽自定義字符串的每個字符。

例:

/*
  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
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM