我在数据库中存储了json格式的日期时间,需要时我需要将其重新转换为日期时间。
解码后,它是一个关联数组:
[date] => 2021-05-20 17:00:00.000000
[timezone_type] => 3
[timezone] => UTC
我对如何将其转换为具有正确时区的日期时间有点困惑......
我发现了
时区可以是 DateTime 对象中三种不同类型之一:
1. Type 1: A UTC offset, such as in new DateTime("17 July 2013 -0300");
2. Type 2; A timezone abbreviation, such as in new DateTime("17 July 2013 GMT");
3. Type 3: A timezone identifier, such as in new DateTime( "17 July 2013", new DateTimeZone("Europe/London"));
但我不确定如何将其应用于我当前的数据。我有 3 个参数,而所有这些解决方案仅使用 2 个参数
这是我想使用的代码:
/**
* @return array|null
* @throws JsonException
* @throws Exception
*/
public function getContext(): ?array
{
$context = json_decode($this->context, true, 512, JSON_THROW_ON_ERROR);
foreach ($context as $key => $value){
if(is_array($value) && isset($value['date'], $value['timezone_type'], $value['timezone'])){
$date = new DateTime($value['date'] . '-' . $value['timezone_type'] );
$context[$key] = $date;
$context[$key] = $date;
}
}
return array_unique($context);
它应该显示
18h00
,但如果没有时区,它会显示 17h00
,有时区它会显示 20h00
你得到的是用
json_encode()
物体喂养 DateTimeInterface
的结果。时区类型是一个不感兴趣的内部字段:
$dt = new DateTime('2021-05-19 20:30:00 +0200');
echo json_encode($dt), PHP_EOL;
$dt = new DateTime('2021-05-19 20:30:00 CEST');
echo json_encode($dt), PHP_EOL;
$dt = new DateTime('2021-05-19 20:30:00 Europe/Berlin');
echo json_encode($dt), PHP_EOL;
{"date":"2021-05-19 20:30:00.000000","timezone_type":1,"timezone":"+02:00"}
{"date":"2021-05-19 20:30:00.000000","timezone_type":2,"timezone":"CEST"}
{"date":"2021-05-19 20:30:00.000000","timezone_type":3,"timezone":"Europe\/Berlin"}
您可以忽略这一点,只需使用其他两个值构建一个字符串,如我的示例所示。
围绕
int
类的 timezone_type
属性 \DateTimeInterface
似乎存在一些混乱。我会尽力解决这个问题。
查看它的唯一方法是使用通用函数导出对象,如var_dump()、var_export()、print_r(),当然还有json_encode()。这些函数没有关于它们要转储的对象的具体知识,它们只是枚举它们找到的属性。
但是此属性没有记录,无论是在 DateTimeInterface 中还是在 DateTime 或 DateTimeImmutable 手册页中。您无法从用户态代码中读取它:
$now = new \DateTime();
echo $now->timezone_type; // Warning: Undefined property: DateTime::$timezone_type
你也写不出来。您不能将其作为参数传递给任何方法,也不能从任何方法接收输出。
该属性存在于支持日期/时间扩展的底层 C 代码中,PHP 本身需要执行其日期和时间操作。它之所以被泄露,是因为通用转储函数尚未经过调整以产生不同类型的输出。它不是用户层 API 的一部分。因此,您可以放心地忽略它,因为您不需要它,也无法使用它。我能想到的唯一可能的用例是在原始 PHP 中进行自己的日期计算,这本质上就像避免使用
*
运算符并进行自己的乘法运算。
无论谁实现了
json_encode()
,都可能决定多做一些事情,生成一个 ISO 8601 字符串,而不是处理任何其他 PHP 对象的 DateTime 对象。但他们没有。我认为这没关系,因为 JSON 标准 毕竟没有定义任何日期或时间格式。