2011-08-16 70 views
0

我有這樣的字符串:格式化字符串轉換成合適的UTC偏移

-4:00 
3:15 
+8:30 

我需要進行格式化爲UTC偏移像值:

-0400 
+0315 
+0815 

我如何轉換樣本串到最後的字符串?我知道它可能使用了一些組合str_replacesprintf,但我無法解決它。

謝謝!

+0

如果你仍然在尋找一個簡單的解決方案:'$ offset = vsprintf('%+ 03d:%02d',sscanf($ offset,'%d:%d'));' - [完整答案和演示(http://stackoverflow.com/questions/7072350/formatting-string-into-appropriate-utc-offset/7072627#7072627)。 – hakre

回答

0

在這裏的三個步驟是:

$offset = preg_replace('/:/','',$offset); 
$offset = preg_replace('/\b(?=\d{3}$)/', '0', $offset); 
$offset = preg_replace('/^(?=\d)/m', '+', $offset); 

可以刪除m標誌的第二正則表達式,如果你只有經過一次一個偏移。

+0

這非常接近。像'-10:30'這樣的值不會丟失':'。另外,這在原始問題中被忽略了,有些值沒有':'。例如,有'-9'這樣的值。我怎樣才能讓他們拿起領先和尾隨的0?非常感謝! – tollmanz

+0

我想我解決了這兩個問題,但我沒有對它進行測試。回家後,如果這不起作用,我會稍後再檢查。 –

+0

這樣做!謝謝! – tollmanz

0

您想要支持的輸入格式的一組正則表達式替換可能是最易讀和可維護的。

+0

我仍然沒有正則表達式。你知道我會做什麼嗎? – tollmanz

+0

@Henning Makholm:我會首先爲輸入格式選擇'sscanf'。這也是一種正則表達式,但並不那麼複雜。 – hakre

1

首先,檢查輸入字符串是否匹配。如果是這樣,則從結果中刪除整個匹配的字符串,如果只有兩個部分,則缺少前導符號。在這種情況下,在開頭添加一個加號,並將小時填入長度爲2.最後將該數組轉換爲字符串。

foreach (array('-1:50','1:50','+1:50','-12:00','12:00','+12:00') as $input) { 
    echo $input . ': '; 

    if (preg_match('/^([-+])?([1-9][0-9]?):([0-9]{2})$/DX', $input, $asMatch) === 1) { 
    unset($asMatch[0]); 
    if ($asMatch[1] === '') { 
     array_unshift($asMatch, '+'); 
    } 
    $asMatch[2] = str_pad($asMatch[2], 2, '0', STR_PAD_LEFT); 
    echo implode('', $asMatch); 
    } 

    echo "\n"; 
} 
+0

謝謝,但這不起作用。 '-12:00'變成'= -1200'。事實上,所有負值都會顯示'='符號。所有正值保留':'並且沒有前導零。 – tollmanz

+0

@沙丁我更新了我的答案,並添加了6個測試用例。他們現在都工作。 – Shi

+1

這麼簡單的任務有那麼多代碼? – hakre

3

這看起來像一個非常簡單的重新格式化我(Demo):

$offset = vsprintf('%+03d%02d', sscanf($offset, '%d:%d')); 

0被視爲正數(++0000)。

+0

+1爲簡單起見,不使用'preg_replace'。 Minor nitpick:在輸出中應該省略冒號。 –

+0

@fireeyedboy:感謝格式化字符串,輸出很容易改變;) - 現在糾正了,併爲演示添加了更多的值。 – hakre

+0

+1我喜歡它有多簡單。如果偏移量已經正確指定,它會中斷。試用-900。 –

相關問題