#php #datetime #php-5.6
#php #datetime #php-5.6
Вопрос:
Хорошо, в принципе, я немного смущен тем, как работает временная метка в DateTime в PHP. Я хочу создать два метода, которые преобразуют местное время в UTC и наоборот.
В настоящее время у меня есть это:
/**
* @param IPSDateTime $utcDateTime The UTC datetime.
* @param DateTimeZone $timezone The timezone to convert the UTC time to.
* @return IPSDateTime New datetime object in local datetime.
* @throws Exception when the UTC date is not in UTC format. (debugging purposes)
*/
public static function utcToLocal($utcDateTime, $timezone)
{
if ($utcDateTime->getTimezone()->getName() !== "UTC") {
throw new Exception("Date time is not UTC!");
}
$time = new DateTime($utcDateTime, new DateTimeZone("UTC"));
$time->setTimezone($timezone);
return $time;
}
/**
* @param IPSDateTime $localDateTime A datetime configured with the the user's timezone
* @return DateTime New datetime object in UTC format
* @throws Exception When given datetime is already in UTC (for debugging purposes)
*/
public static function localToUtc($localDateTime)
{
if ($localDateTime->getTimezone()->getName() === "UTC") {
throw new Exception("Value is already UTC");
}
$time = new DateTime($localDateTime, $localDateTime->getTimezone());
$time->setTimezone(new DateTimeZone("UTC"));
return $time;
}
Когда я отлаживаю этот код, в последней строке return $time
localToUtc(...)
моего отладчика отображаются правильные преобразования:
Однако, когда я оцениваю выражение
$localDateTime->getTimestamp() === $time->getTimestamp()
он вернет true.
Итак, я немного смущен, я просто хочу, чтобы временные метки менялись при смене часового пояса. Я думаю, может быть, мне нужно поработать, getOffset()
но я хочу убедиться, что я делаю это правильно. Я бы также предпочел не использовать какие-либо трюки с форматом строки, потому что я чувствую, что это неправильный способ.
Комментарии:
1. Действительно ли оба вывода временных меток действительно совпадают друг с другом, даже если часовые пояса разные???
2. @UmairShahYousafzai Да. Они идентичны. Их печать показывает то же самое.
3. Это происходит потому, что временные метки всегда являются UTC. См. en.wikipedia.org/wiki/Unix_time и php.net/manual/en/datetime.gettimestamp.php