我有一个表格,其中日期/时间信息存储为字符串。由于计划不周,一些字符串中包含时区(例如"2014-01-13 04:22 -8"
)而其他字符串则没有("2014-01-13 04:22"
)。任何类型的字符串都可以与strtotime()
或new DateTime()
一起使用,但是一旦我这样做,关于是否存在时区的信息就会丢失 - 没有时区的字符串被分配服务器的默认时区。是否有一个函数可以用来确定字符串是否包含时区标识符?
为此写一个正则表达式似乎是微不足道的,但经验告诉我,日期格式有足够的变化和奇怪的特殊情况,在可能的情况下使用内置函数总是更好。
答案 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中解释的时区类型。
此方法允许您避免在日期/时间字符串上使用正则表达式,使用的正则表达式是具有已知且可靠格式的字符串。