2013-08-05 3 views
1

У меня есть строка в этом формате: 2013-07-31T19:20:30.45-07:00, и я хочу разобрать ее, чтобы я мог, например, сказать, в какой именно день недели. Но я изо всех сил пытаюсь справиться с смещением временной зоны. Если я date_parse("2013-07-31T19:20:30.45-07:00") тогда я в конечном итоге с чем-то вроде этого:Разбор строки datetime с часовым поясом в PHP

array(15) { 
    ["year"]=> int(2013) 
    ["month"]=> int(7) 
    ["day"]=> int(31) 
    ["hour"]=> int(19) 
    ["minute"]=> int(20) 
    ["second"]=> int(30) 
    ["fraction"]=> float(0.45) 
    ["warning_count"]=> int(0) 
    ["warnings"]=> array(0) { } 
    ["error_count"]=> int(0) 
    ["errors"]=> array(0) { } 
    ["is_localtime"]=> bool(true) 
    ["zone_type"]=> int(1) 
    ["zone"]=> int(420) 
    ["is_dst"]=> bool(false) 
} 

Это сделано что-то с часовым поясом, но что мне делать с 420, если я хочу, чтобы, например, показать информацию о часовом поясе?

В случае, если это имеет значение, я ранее установил свой часовой пояс по умолчанию, используя date_default_timezone_set('UTC').

UPDATE: Если строка имеет положительный часовой пояс, например, 2013-07-31T19:20:30.45+07:00 то последняя часть date_parse() выхода:

["is_localtime"]=> bool(true) 
    ["zone_type"]=> int(1) 
    ["zone"]=> int(-420) 
    ["is_dst"]=> bool(false) 
} 

ответ

1

420 находится зона в минутах.

420/60 = 7

Я хочу, чтобы разобрать его так, что я могу, например, сказать, какой день недели это.

Если вы хотите узнать, в какой именно день недели, у вас есть много вариантов. Например, вы можете использовать функции даты и mktime:

$parsed = date_parse("2013-07-31T19:20:30.45-07:00"); 
$unix_timestamp = mktime($parsed['hour'], 0, 0, $parsed['month'], $parsed['day'], $parsed['year'], (int)$parsed['is_dst']); 

echo date('l', $unix_timestamp); 

Значит, вы хотите показать информацию о часовом поясе? Вы можете получить имя часового пояса с помощью timezone_name_from_abbr функции:

$name = timezone_name_from_abbr("", -1*$parsed['zone']*60, false); // NB: Offset in seconds! 
var_dump($name); 

$timezone = new DateTimezone($name); 
var_dump($timezone); 
+0

Я даже не заметил, что в зоне может быть минут! Я добавил пример с положительным часовым поясом ... Мне кажется, что «зона» - это противоположность тому, что я ожидаю ...? –

+0

Хорошо, вы можете забыть поле zone_type в этом случае. Смещение временной зоны может составлять 15, 30 или 60 минут. – iiro

+0

Отлично, спасибо! Прошло много времени с тех пор, как я сделал много PHP, и мне удалось во многом избежать часовых поясов, когда я в последний раз это делал. –

0
2013-07-31T19:20:30.45-07:00 
^ y-m-d ^time ^timezone offset 

Я предполагаю, что часовой пояс является -7 hours от UTC.

Имейте в виду, что в некоторых странах есть часовые пояса или даже минутные часовые пояса. Вероятно, поэтому вы получаете часовой пояс за считанные минуты.

+0

Спасибо - я даже не понял, что '420' было минут! –

Смежные вопросы