2016-08-30 16 views
1

我想根据时区获取正确的日期。算术标志在时间不正常工作

ex。我有一个GMT时区+5:30的时区。如果格林尼治标准时间是2016年8月30日下午1点,那么对于gmt + 5:30应该给我2016年8月30日下午6点30分但是,增加这样的时区实际上会减少它,而不是增加。

我有这样的代码:

$a=date('Y-m-d H:i:s'); 

这给了我2016年8月30日7时36分01秒按GMT这是正确的。

$b="+5:30"; 
$c=(strtotime($a.$b)); 
echo($c); 

它给我30 8月2016 02:08:25这是错误的我应该得到2016年8月30日13:10:32。

我的意思是,如果我添加时区值,它会被扣除,如果我以-5:30作为时区,我会得到正确的结果。有人可以请建议我做错了什么,或者这应该如何工作。

+0

由于strtotime是一个Stringparser,它有时会表现奇怪。我会建议计算时间戳不是日期,或使用日期时间。在DateTime中,您可以更改时区并获得您想要的结果。 –

回答

0

使用DateTimeZoneDateTime对象,使之更加明显带有时区偏移工作时:

$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" 
+0

谢谢你!这正是我所寻找的。 –

+0

@ UmeshKaushik,你试过接受答案吗? – RomanPerekhrest

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); 

我觉得上面的解决方案对你有帮助,虽然我没有测试过。

+0

不过,谢谢你,@RomanPerekhrest运作良好。感谢您的建议。 –

0

当你使用像datestrtotime功能,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时间戳,事实就揭示了datestrtotime正在做什么。

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通过在数据库中查找所需的时区信息来计算全部数据。因为我们正确指定了所提供的时区和转换的时区,我们可以放心,无论我们随后在多个时区之间转换多少次,我们始终都有准确的时间。这是一个比你想要做的更可靠的抽象。