Вызов 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
Чтобы получить текущую дату в настроенном часовом поясе.