无论我使用哪个时区,我都会得到相同的结果。
我希望输入(第二个参数)的时间是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), }
答案 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"
}