带有时区的DateTime :: createFromFormat确实会更改输出

时间:2019-05-07 23:16:41

标签: php datetime

无论我使用哪个时区,我都会得到相同的结果。

我希望输入(第二个参数)的时间是UTC-似乎不是。

在这种情况下,如果我们没有在选定的时区中获取时间,而是重复输入的时间,那么第三个参数-时区有什么用?

我看到了偏移量(用括号括起来),但是不明白,这在实际中是多么有用。

如果有人能解释,我很欣赏我在这里所说的不对。

当我使用时:

DateTime::createFromFormat("Y-m-d H:i:s", "2019-05-31 10:00:56", new DateTimeZone('America/Fortaleza'));

我明白了:

DateTime @1559307656 {#1978
  date: 2019-05-31 10:00:56.0 America/Fortaleza (-03:00),
}

我希望得到:

DateTime @1559307656 {#1978
  date: 2019-05-31 07:00:56.0 America/Fortaleza (-03:00),
}

实际上,无论输入的时区如何,我都没有任何改变:


>>> DateTime::createFromFormat("Y-m-d H:i:s", "2019-05-31 10:00:56", new DateTimeZone('UTC'))
DateTime @1559296856 {#1979
  date: 2019-05-31 10:00:56.0 UTC (+00:00),
}

>>> DateTime::createFromFormat("Y-m-d H:i:s", "2019-05-31 10:00:56", new DateTimeZone('Europe/Moscow'))
DateTime @1559286056 {#1958
  date: 2019-05-31 10:00:56.0 Europe/Moscow (+03:00),
}

1 个答案:

答案 0 :(得分:1)

您误解了第三个参数的使用。它用于告诉DateTime::createFromFormat您经过的时间的时区是什么,它也成为结果的时区。如果您输入的时间为UTC,则这是第三个参数的适当值,然后您可以使用DateTime::setTimeZone来设置值的时区:

$date = DateTime::createFromFormat("Y-m-d H:i:s", "2019-05-31 10:00:56", new DateTimeZone('UTC'));
$date->setTimeZone(new DateTimeZone('America/Fortaleza'));
var_dump($date);

输出:

object(DateTime)#2 (3) {
  ["date"]=> string(26) "2019-05-31 07:00:56.000000"
  ["timezone_type"]=> int(3)
  ["timezone"]=> string(17) "America/Fortaleza" 
}

Demo on 3v4l.org