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

时间:2014-01-31 16:38:44

标签: php datetime timezone

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

为此写一个正则表达式似乎是微不足道的,但经验告诉我,日期格式有足够的变化和奇怪的特殊情况,在可能的情况下使用内置函数总是更好。

2 个答案:

答案 0 :(得分:1)

像这样的正则表达式:

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

在字符串末尾查找+-后跟1或2个数字。

如果你输入了conains:

2004-10-10

-10将被检测为时区,因此可能会添加[空格]检测:

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

如果您的时间戳字符串始终为:

YYYY-mm-dd HH:ii[ timezone]

然后即使是简单的strlen检查就足够了。 16 =没有时区,17 + =时区。

答案 1 :(得分:1)

创建DateTime对象后,您不一定会丢失有关日期/时间字符串中是否存在时区的信息。如果在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)

正如你所看到的,timezone type和时区的价值都在那里,这只是一个钓鱼的问题。

在您的情况下,我认为您只需要知道是否在日期/时间字符串中传递了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,它对应于我的答案here中解释的时区类型。

See it working

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