我想根据时区获取正确的日期。
离。格林威治标准时间+5:30。如果格林威治标准时间是2016年8月30日下午1:00,那么对于gmt + 5:30应该会给我2016年8月30日下午6:30但是,添加这样的时区实际上会减去它而不是添加。
我有这段代码:
$a=date('Y-m-d H:i:s');
根据GMT给我2016-08-30 07:36:01这是正确的。
$b="+5:30";
$c=(strtotime($a.$b));
echo($c);
它给了我2016年8月30日02:08:25这是错的我应该得到2016年8月30日13:10:32。
我的意思是,如果我添加时区值,它会被减去,如果我以-5:30作为时区,我会得到正确的结果。有人可以建议我做错了什么或者它应该如何实际起作用。
答案 0 :(得分:0)
试试这个:
解决方案1:
$minutesToBeAdded = 330;
$currentDate = date('Y-m-d H:i:s');
$currentTime = new DateTime($currentDate);
$currentTime->add(new DateInterval('PT' . $minutesToBeAdded . 'M'));
$newTime = $currentTime->format('Y-m-d H:i');
解决方案2:
$currentDate = date('Y-m-d H:i:s');
$dateTime = new DateTime($currentDate);
$dateTime->modify('+330 minutes');
解决方案3:
$currentDate = date('Y-m-d H:i:s');
$newTime = strtotime($currentDate . ' + 330 minute');
echo date('Y-m-d H:i:s', $newTime);
我认为上述解决方案对您有所帮助,但我还没有对其进行测试。
答案 1 :(得分:0)
使用DateTimeZone
和DateTime
对象在处理时区偏移时更明显:
$a = "2016-08-30 07:36:01";
$b = "+5:30";
$gmtTz = new \DateTimeZone("GMT");
$offset = new \DateTimeZone($b);
$dt = new \DateTime($a, $gmtTz);
$dt->setTimezone($offset);
echo $dt->format("Y-m-d H:i:s"); // "016-08-30 13:06:01"
答案 2 :(得分:0)
当您使用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"
并将其转换为Unix时间戳,假设我们当前是UTC。在第二种情况下,它采用输入字符串"30 Aug 2016 1:00 pm +5:30"
,其已经具有+5:30的GMT偏移量。所以它假设我们在GMT + 0530下午1点,它试图将其转换回UTC(即+0000),这意味着它现在需要减去5小时30分钟才能到达UTC,这样你就可以了"30 Aug 2016 7:30 am"
使用DateTime
时,更容易避免所有这些混淆,因为您可以明确指定时区或GMT偏移量,而不受隐式时区转换的影响。此外,重要的是要注意在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通过查找数据库中所需的时区信息来计算出所有信息。因为我们正确地指定了所提供的时区和转换的时区,所以我们可以放心,无论我们随后在时区之间进行转换多少次,我们始终都有准确的时间。这是一个比你想要做的更可靠的抽象。