Я пытался конвертировать между часовыми поясами заданную дату и время.
Код говорит больше, чем слова, поэтому вот он:
/** * Returns the date and time in the new timezone. * * @param string $datetime: * the date and time to change between timezones * @param string $input_tz: * the input timezone * @param string $output_tz: * the output timezone * @return string The new date and time */ public function changeDateTime($datetime, $input_tz, $output_tz) { if($input_tz == $output_tz) return $datetime; /* * We calculate the hour and minute offset from GMT */ date_default_timezone_set($output_tz); $out_dst = date('I', $datetime) ? 1 : 0; $out_hour_offset = intval(substr(date('O', $datetime), 1, 3)) + $out_dst; $out_minute_offset = intval(substr(date('O', $datetime)), - 2); date_default_timezone_set($input_tz); $in_dst = date('I', $datetime) ? 1 : 0; $in_hour_offset = intval(substr(date('O', $datetime), 1, 3)) + $in_dst; $in_minute_offset = intval(substr(date('O', $datetime)), - 2); /* * We subtract hour and minute offsets to come up with total difference */ $hour_offset = $out_hour_offset - $in_hour_offset; $minute_offset = $out_minute_offset - $in_minute_offset; /* * Now we must take care of changing the day/month/year if necessary, as * well as the hour/minute for $datetime, and return that value. */ $date = new DateTime($datetime); if($hour_offset > 0) { $date->add(date_interval_create_from_date_string($hour_offset . ' hours')); if($minute_offset > 0) $date->add(date_interval_create_from_date_string($minute_offset . ' minutes')); } else if($hour_offset < 0) { $date->sub(date_interval_create_from_date_string($hour_offset . ' hours')); if($minute_offset > 0) $date->sub(date_interval_create_from_date_string($minute_offset . ' minutes')); } return $date->format('Ymd H:i:s'); }
Однако, похоже, что это не работает. Это код, который я запускаю, чтобы проверить, работает ли он или нет:
$newdatetime = $gato->changeDateTime("2012-08-10 11:33:33", 'Europe/London', 'Europe/Madrid'); echo $newdatetime;
И это мой ожидаемый результат: 2012-08-10 12:33:33
Но это мой фактический результат: 2012-08-10 11:33:33, что означает, что во времени нет изменений.
Хорошо, попробуйте это вместо:
function changeDateTime($datetime, $input_tz, $output_tz) { // Return original string if in and out are the same if($input_tz == $output_tz) { return $datetime; } // Save current timezone setting and set to input timezone $original_tz = date_default_timezone_get(); date_default_timezone_set($input_tz); // Get Unix timestamp based on input time zone $time = strtotime($datetime); // Start working in output timezone date_default_timezone_set($output_tz); // Calculate result $result = date('Ymd H:i:s', $time); // Set timezone correct again date_default_timezone_set($original_tz); // Return result return $result; } $out = changeDateTime("2012-08-10 11:33:33", 'Europe/London', 'Europe/Madrid'); var_dump($out);
Вместо того, чтобы возиться о том, чтобы делать все эти сложные математические вычисления, просто дайте PHP сделать всю тяжелую работу для вас 😉
Посмотрите, как работает