当你使用像date
和strtotime
功能,PHP转换你按照PHP您date.timezone
配置提供输入,这可能不是UTC。因此,在进行转换之前检查或明确设置时区非常重要。
$date = "30 Aug 2016 1:00 pm";
date_default_timezone_set("UTC");
var_dump(date_default_timezone_get()); // gives us "UTC"
var_dump(date("Y-m-d H:i:s", strtotime($date))); // 2016-08-30 13:00:00
var_dump(date("Y-m-d H:i:s", strtotime($date . "+5:30"))); // 2016-08-30 07:30:00
所以,现在你想知道为什么你刚回到5小时30分钟。那么,如果你从strtotime
看到实际的Unix时间戳,事实就揭示了date
和strtotime
正在做什么。
var_dump(strtotime("30 Aug 2016 1:00 pm"), strtotime("30 Aug 2016 1:00 pm +5:30"));
这给了你...
int(1472562000)
int(1472542200)
在第一种情况下,strtotime
需要输入字符串"30 Aug 2016 1:00 pm"
它,我们目前在UTC的假设下转换为Unix时间戳。在第二种情况下,它采用输入字符串"30 Aug 2016 1:00 pm +5:30"
,该字符串的GMT偏移量为+5:30。因此,它假定我们在格林尼治标准时间+ 0530的下午1点,它会尝试将其转换回UTC(即。e +0000),这意味着它现在需要减去5小时30分钟才能到达UTC,这会使您得到"30 Aug 2016 7:30 am"
当您使用DateTime
时,由于您可以明确指定时区或格林尼治标准时间偏移量,不受隐式时区转换影响。此外,重要的是要注意,在PHP中,时区不仅仅是GMT偏移量。 PHP使用Olson Timezone Database在不同的时区可靠而准确地转换日期/时间信息,因为GMT偏移在不同的时区实际上会在一年中发生变化。
// DateTime doesn't try to convert this because you told it what the timezone is
$dt = new DateTime("30 Aug 2016 1:00 pm", new DateTimezone("UTC"));
// now lets try with the offset
$dt->setTimezone(new DateTimezone("Asia/Kolkata"));
var_dump($dt->format("j M Y g:i a")); // "30 Aug 2016 6:30 pm"
请注意,您不需要实际弄乱添加/减少多少小时/分钟。 PHP通过在数据库中查找所需的时区信息来计算全部数据。因为我们正确指定了所提供的时区和转换的时区,我们可以放心,无论我们随后在多个时区之间转换多少次,我们始终都有准确的时间。这是一个比你想要做的更可靠的抽象。
由于strtotime是一个Stringparser,它有时会表现奇怪。我会建议计算时间戳不是日期,或使用日期时间。在DateTime中,您可以更改时区并获得您想要的结果。 –