将字符串格式化为适当的UTC偏移量

时间:2011-08-16 00:30:57

标签: php regex utc

我有像:

这样的字符串
-4:00
3:15
+8:30

我需要将它们格式化为UTC偏移值,如:

-0400
+0315
+0815

如何将示例字符串转换为最终字符串?我知道它可能使用str_replacesprintf的一些组合,但我无法解决它。

谢谢!

4 个答案:

答案 0 :(得分:3)

对我来说这看起来很简单(Demo):

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

0被视为正数(+中的+0000)。

答案 1 :(得分: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";
}

答案 2 :(得分:0)

您希望支持的输入格式的一组正则表达式替换可能是最易读和可维护的。

答案 3 :(得分:0)

这里分三步:

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

如果您一次只传递一个偏移量,则可以删除第二个正则表达式上的m标记。