Подтвердить что ты не робот

Дата Date.today в UTC?

Вызов Date.today в Ruby возвращает текущую дату. Но какой часовой пояс? Я предполагаю UTC, но я хочу убедиться. Документация не указана в любом случае.

4b9b3361

Ответ 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

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