Вызов Date.today
в Ruby возвращает текущую дату. Но какой часовой пояс? Я предполагаю UTC, но я хочу убедиться. Документация не указана в любом случае.
Дата Date.today в UTC?
Ответ 1
Даты не имеют временных интервалов, так как они не представляют собой время.
Что касается того, как он вычисляет текущий день, давайте посмотрим на этот фрагмент из кода для 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
конвертировать его на место в UTC или Time#getutc
, чтобы вернуть новый эквивалентный объект Time
в UTC. Затем вы можете вызвать Time#to_date
, чтобы получить Date
. Итак: some_time.getutc.to_date
.
Если вы используете поддержку часового пояса ActiveSupports (входит в состав Rails), обратите внимание, что он полностью отделен от конструкторов времени Rubys и не влияет на них (т.е. он не измените, как работают Time.now
или Date.today
). См. Также Расширения ActiveSupport до Time
.
Ответ 2
Вы можете уйти, используя
Time.now.utc.to_date
в рубине
Ответ 3
Экземпляр даты представлен как астрономический номер юлианского дня; он не имеет дробной части дня. В то время как Юлианский день относится к 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"
Ответ 4
Если ваши приложения-рельсы настроены на запуск в часовом поясе UTC, просто используйте Time.zone.today
, иначе принудительно используйте его с помощью Time.now.utc.to_date
Ответ 5
Вы можете использовать
Date.current
Чтобы получить текущую дату в настроенном часовом поясе.