Я хотел бы в любой момент определить, какое смещение UTC находится между часами 00:00
в 00:59
,
Есть ли краткий способ получить это, не прибегая к ручной итерации по смещению? Возможно, с помощью конвертации из текущего времени UTC?
С помощью DateTime
а также DateTimeZone
1 Вы можете создать полезную функцию:
/*
Return UTC Offsets/Timezones in which is 00AM at passed time string
@param string original time string (default: current time)
@param string original timezone string (default: UTC)
@param bool return as Timezones instead as UTC Offests (default: False)
@retval array array of UTC Offsets or Timezones
*/
function getMidNight( $timeString=Null, $timeZone=Null, $returnTimeZone=False )
{
$utc = new DateTimeZone( 'UTC' );
$baseTimeZone = ( $timeZone ) ? new DateTimeZone( $timeZone ) : $utc;
$date = new DateTime( $timeString, $baseTimeZone );
$retval = array();
foreach( DateTimeZone::listIdentifiers() as $tz )
{
$currentTimeZone = new DateTimeZone( $tz );
if( ! $date->setTimezone( $currentTimeZone )->format('G') )
{
if( $returnTimeZone ) $retval[] = $tz;
else $retval[] = $date->getOffset();
}
}
return array_unique( $retval );
}
G
формат 24 часа без нуля в начале, поэтому при 00
является False
,
->listIdentifiers()
возвращает список всех определенных идентификаторов часовых поясов.
Затем, называя это таким образом2:
print_r( getMidNight() );
Вы получите3:
Array
(
[0] => 46800
[1] => -39600
)
И, называя это таким образом2:
print_r( getMidNight( Null, Null, True ) );
Вы получите:
Array
(
[0] => Antarctica/McMurdo
[1] => Pacific/Auckland
[2] => Pacific/Enderbury
[3] => Pacific/Fakaofo
[4] => Pacific/Midway
[5] => Pacific/Niue
[6] => Pacific/Pago_Pago
[7] => Pacific/Tongatapu
)
Других решений пока нет …