找出日期/时间字符串是否包含时区



我有一个表格/时间信息作为字符串存储的表。由于计划较差,其中一些字符串中有一个时区(例如"2014-01-13 04:22 -8"),而其他字符串则没有("2014-01-13 04:22")。字符串类型可与strtotime()new DateTime()一起使用,但是一旦我这样做,有关是否丢失了时区的信息 - 分配了没有时区的字符串,则分配了服务器的默认时区。我可以使用一个函数来找出字符串是否包含时区标识符?

IT 为此编写一条正则表达式似乎很琐碎,但是经验告诉我,日期格式具有足够的变化和怪异的特殊情况,最好在可能的情况下使用内置功能。

regexp类似:

$str = "2014-01-13 04:22 -8"
$has_timezone = preg_match(/[-+][0-9]{1,2}$/, $str);

在字符串的末尾寻找+-,然后是1或2个数字。

如果您输入也要圆锥:

2004-10-10

-10将被检测为时区,因此也许添加[空间]检测:

$has_timezone = preg_match(/s[-+][0-9]{1,2}$/, $str);

如果您的时间戳字符串总是:

YYYY-mm-dd HH:ii[ timezone]

那么,即使是简单的strlen检查就足够了。16 =无时区,17 =时区。

您不一定会丢失有关一旦创建日期/时间字符串的时区,就不一定会丢失信息。如果您在DateTime对象上执行var_dump(),则将获得这样的输出: -

object(DateTime)[1]
  public 'date' => string '2014-01-13 04:22:00' (length=19)
  public 'timezone_type' => int 1
  public 'timezone' => string '-08:00' (length=6)

您可以看到,时区类型和时区的价值都在那里,这只是钓鱼的问题。

在您的情况下,我认为您只需要知道是否在日期/时间字符串中传递了一个TZ字符串。如果是这样,那么时区类型将为1,如果不存在字符串,则将使用默认系统时区,并且将使用3型。

您无法直接获得时区类型,但是以下功能将为您获取,然后您可以采取相应的行动。

function getTZType(DateTime $date)
{
    ob_start();
    var_export($date);
    $dateString = ob_get_clean();
    preg_match('%=>.d%', $dateString, $matches);
    return (int)explode(' ', $matches[0])[1];
}
$date = new DateTime('2014-01-13 04:22 -8');
echo getTZType($date);

该功能返回与我答案中解释的时区类型相对应的INT 1,2或3。

看到它有效。

此方法将允许您避免在日期/时间字符串上使用Regex,所使用的正则是具有已知可靠格式的字符串。

相关内容

  • 没有找到相关文章

最新更新