【问题标题】:Formatting string into appropriate UTC offset将字符串格式化为适当的 UTC 偏移量
【发布时间】:2011-08-16 00:30:57
【问题描述】:

我有这样的字符串:

-4:00
3:15
+8:30

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

-0400
+0315
+0815

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

谢谢!

【问题讨论】:

  • 如果您仍在寻找简单的解决方案:$offset = vsprintf('%+03d:%02d', sscanf($offset, '%d:%d')); - full answer and demo

标签: php regex utc


【解决方案1】:

对我来说,这看起来像是一个非常简单的重新格式化 (Demo):

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

0 被视为正数(++0000 相同)。

【讨论】:

  • +1 为简单起见,不使用preg_replace。次要的 nitpick:在输出中应该省略冒号。
  • @fireeyedboy:感谢格式字符串,输出很容易更改;) - 现在已更正,也为演示添加了更多值。
  • +1 我喜欢它的简单性。尽管如果已经正确指定了偏移量,它会中断。试试 -900。
【解决方案2】:

首先,检查输入字符串是否匹配。如果是,则从结果中删除整个匹配字符串,如果只有两个部分,则缺少前导符号。在这种情况下,在开头添加一个加号并将小时填充为 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";
}

【讨论】:

  • 谢谢,但这不起作用。 -12:00 变为 =-1200。事实上,所有负值都带有= 符号。所有正值都保留:,并且没有前导零。
  • @Sardine 我更新了我的答案并添加了 6 个测试用例。他们现在都工作了。
  • 简单取决于视图:如果输入已经被验证为有效,那么您的解决方案非常好。如果不是,那么您会得到一个结果,但它不是预期的,并且代码无法标记它。这完全取决于您对(用户)输入的信任程度。
  • @Shi:检查sscanf的返回值没有问题。顺便说一句,您的代码不会错误检查,它也会返回一个空字符串而不是错误。只是说,应该进行错误检查是对的。
【解决方案3】:

这里分三步:

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

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

【讨论】:

  • 这非常接近。像-10:30 这样的值不会丢失:。此外,这在原始问题中被忽略了,有些值没有:。例如,有像-9 这样的值。我怎样才能让那些拿起前导和尾随的0?到目前为止谢谢!
  • 我想我解决了这两个问题,但我没有测试它。回家了,但如果这不起作用,我会稍后检查。
【解决方案4】:

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

【讨论】:

  • 我仍然没有正则表达式。你知道我会怎么做吗?
  • @Henning Makholm:我会首先选择sscanf 作为输入格式。这也是一种正则表达式,但没那么复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多