算术标志在strtotime中不能正常工作

时间:2016-08-30 07:49:02

标签: php datetime strtotime

我想根据时区获取正确的日期。

离。格林威治标准时间+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作为时区,我会得到正确的结果。有人可以建议我做错了什么或者它应该如何实际起作用。

3 个答案:

答案 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)

使用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"

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