2012-04-18 2 views

ответ

28

Даты не имеют временных зон, так как они не представляют собой время.

Тем не менее, как и для как вычисляет текущий день, давайте посмотрим на этот экстракт из the code for Date.today:

time_t t; 
struct tm tm; 
// ... 
if (time(&t) == -1) 
    rb_sys_fail("time"); 
if (!localtime_r(&t, &tm)) 
    rb_sys_fail("localtime"); 

Затем переходит к использованию использовать tm для создания Date объекта. Так как tm содержит местное время системы с использованием localtime(), Date.today поэтому использует локальное время системы, а не UTC.


Вы всегда можете использовать Time#utc на любой Time преобразовать его в месте по Гринвичу, или Time#getutc вернуть новый эквивалентный Time объект в формате UTC. Затем вы можете позвонить Time#to_date, чтобы получить Date. Итак: some_time.getutc.to_date.

Если вы используете ActiveSupport’s time zone support (в комплекте с Rails), обратите внимание, что полностью отделено от времени конструкторов в Ruby и не влияют на них (т.е. это не меняет Time.now или Date.today работы). См. Также ActiveSupport extensions to Time.

+0

Спасибо за разъяснение. Думаю, лучший способ задать свой вопрос был бы «в связи с тем, что часовой пояс на Date.today вернется на следующий день?» Я полагаю, что если мне нужна «сегодняшняя дата в UTC», мне нужно будет сделать что-то вроде «Time.now.zone.to_date» (в Rails). –

+0

'Time.zone.now.to_date' будет использовать любой часовой пояс, на который настроено приложение. Стоит посмотреть в 'Time.use_zone ('[имя зоны]')', если вы хотите установить часовой пояс для определенного блока кода, в этом случае - UTC. –

+5

Да с управлением часовым поясом ActiveSupport вы можете сделать 'Time.zone.now.to_date', который равен' Time.current.to_date', который равен 'Date.current'. –

10

Экземпляр Даты представлен как астрономический номер юлианского дня; он не имеет дробной части дня. В то время как Юлианский день относится к GMT - поэтому технически экземпляр Date должен считаться находящимся в GMT - для большинства целей вы можете игнорировать это и относиться к нему как к отсутствующему часовому поясу. Вы будете заботиться только о часовом поясе, если вы преобразуете его в DateTime или Time.

Инструменты ActiveSupport для преобразования даты позволяют указать, хотите ли вы местное время или UTC.

Например:

>> t = Date.today.to_time 
=> Wed Apr 18 00:00:00 -0400 2012 
>> t.zone 
=> "EDT" 
>> t = Date.today.to_time(:utc) 
=> Wed Apr 18 00:00:00 UTC 2012 
>> t.zone 
=> "UTC" 
+0

См. Комментарий, который я сделал в ответ @ AndrewMarshall относительно того, почему я задал оригинальный вопрос. В принципе, я пытаюсь выяснить, будет ли Date.today в локальной системе таким же, как Date.today в системе в UTC. –

+1

Как говорит Эндрю, Date.today генерирует дату с местного времени, а не UTC. Чтобы получить актуальную дату в UTC, попробуйте Time.now.utc.to_date –

+0

Я бы просто отметил, что, хотя в некоторых странах игнорирование часового пояса может работать, здесь, в Новой Зеландии, вы получаете неправильную дату для большую часть рабочего дня, если вы это сделаете. (например, 10 утра местного времени 13 февраля, я думаю, 2100 UTC на 12-м). – Rich

47

Вы можете уйти с помощью

Time.now.utc.to_date

рубина

+3

Гораздо лучше, чем принятый ответ. Интересно, добавлено ли это с апреля 2012 года. –

+2

это полезная информация, но она не отвечает на вопрос. это отвечает на соответствующий вопрос «как я могу получить дату текущего времени UTC?», плакат спросил, Date.today был в UTC или нет, а не как получить дату в utc. –

1

Если приложения Перила настроен для работы в часовом поясе UTC затем просто использовать Time.zone.today , в противном случае заставьте его с помощью Time.now.utc.to_date

0

Вы можете использовать

Date.current 

Чтобы получить текущую дату сконфигурированной часового пояса.

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