如何在 PHP 中将 json 日期时间转换为日期时间

问题描述 投票:0回答:1

我在数据库中存储了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

php datetime
1个回答
-1
投票

你得到的是用

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 中还是在 DateTimeDateTimeImmutable 手册页中。您无法从用户态代码中读取它:

$now = new \DateTime();
echo $now->timezone_type; // Warning: Undefined property: DateTime::$timezone_type

你也写不出来。您不能将其作为参数传递给任何方法,也不能从任何方法接收输出。

该属性存在于支持日期/时间扩展的底层 C 代码中,PHP 本身需要执行其日期和时间操作。它之所以被泄露,是因为通用转储函数尚未经过调整以产生不同类型的输出。它不是用户层 API 的一部分。因此,您可以放心地忽略它,因为您不需要它,也无法使用它。我能想到的唯一可能的用例是在原始 PHP 中进行自己的日期计算,这本质上就像避免使用

*
运算符并进行自己的乘法运算。

无论谁实现了

json_encode()
,都可能决定多做一些事情,生成一个 ISO 8601 字符串,而不是处理任何其他 PHP 对象的 DateTime 对象。但他们没有。我认为这没关系,因为 JSON 标准 毕竟没有定义任何日期或时间格式。

© www.soinside.com 2019 - 2024. All rights reserved.