我有一个表格/时间信息作为字符串存储的表。由于计划较差,其中一些字符串中有一个时区(例如"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,所使用的正则是具有已知可靠格式的字符串。