算术符号在 strtotime 中不能正常工作
Arithmatic signs are not working properly in strtotime
我想根据时区获取正确的日期。
例如。我有一个格林威治标准时间 +5:30 的时区。如果 GMT 是 2016 年 8 月 30 日 1:00 pm,那么 gmt+5:30 应该给我 2016 年 8 月 30 日 6:30 pm 但是,添加这样的时区实际上是减去它而不是添加。
我有这个代码:
$a=date('Y-m-d H:i:s');
根据格林威治标准时间给我 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 作为时区,我会得到正确的结果。有人可以建议我做错了什么或者这实际上应该如何工作。
试试这个:
解决方法一:
$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);
虽然我没有测试过,但我认为上述解决方案会对您有所帮助。
使用 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"
当您使用 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:00 PM,它会尝试将其转换回 UTC(即 +0000),这意味着它现在需要减去 5 小时 30 分钟才能到达 UTC,这给你 "30 Aug 2016 7:30 am"
使用 DateTime
可以更容易地避免所有这些混淆,因为您可以显式指定时区或 GMT 偏移量,而不必进行隐式时区转换。此外,请务必注意,在 PHP 中,时区不仅仅是 GMT 时差。 PHP 使用 Olson Timezone Database 可靠准确地转换 date/time 跨不同时区的信息,因为格林威治标准时间偏移量在不同时区全年可能会发生变化。
// 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"
请注意,您无需真正纠结 hours/minutes 到 add/subtract 的数量。 PHP 通过在数据库中查找所需的时区信息来解决所有问题。因为我们正确指定了提供的时区和转换的时区,所以我们可以放心,无论我们随后在时区之间转换多少次,我们始终拥有准确的时间。这是一个比您尝试做的更可靠的抽象。
我想根据时区获取正确的日期。
例如。我有一个格林威治标准时间 +5:30 的时区。如果 GMT 是 2016 年 8 月 30 日 1:00 pm,那么 gmt+5:30 应该给我 2016 年 8 月 30 日 6:30 pm 但是,添加这样的时区实际上是减去它而不是添加。
我有这个代码:
$a=date('Y-m-d H:i:s');
根据格林威治标准时间给我 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 作为时区,我会得到正确的结果。有人可以建议我做错了什么或者这实际上应该如何工作。
试试这个:
解决方法一:
$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);
虽然我没有测试过,但我认为上述解决方案会对您有所帮助。
使用 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"
当您使用 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:00 PM,它会尝试将其转换回 UTC(即 +0000),这意味着它现在需要减去 5 小时 30 分钟才能到达 UTC,这给你 "30 Aug 2016 7:30 am"
使用 DateTime
可以更容易地避免所有这些混淆,因为您可以显式指定时区或 GMT 偏移量,而不必进行隐式时区转换。此外,请务必注意,在 PHP 中,时区不仅仅是 GMT 时差。 PHP 使用 Olson Timezone Database 可靠准确地转换 date/time 跨不同时区的信息,因为格林威治标准时间偏移量在不同时区全年可能会发生变化。
// 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"
请注意,您无需真正纠结 hours/minutes 到 add/subtract 的数量。 PHP 通过在数据库中查找所需的时区信息来解决所有问题。因为我们正确指定了提供的时区和转换的时区,所以我们可以放心,无论我们随后在时区之间转换多少次,我们始终拥有准确的时间。这是一个比您尝试做的更可靠的抽象。