Matt Huggins
Matt Huggins

Reputation: 83289

Is Date.today in UTC?

Calling Date.today in Ruby returns the current date. However, what timezone is it in? I assume UTC, but I want to make sure. The documentation doesn't state either way.

Upvotes: 46

Views: 37769

Answers (6)

jox
jox

Reputation: 2368

Ruby

# Using local timezone
Date.today

Ruby on Rails

# Using UTC
Date.yesterday
Date.current
Date.tomorrow

This is specifically nasty because when using e.g. Date.today and Date.yesterday in conjunction, it might produce quite unexpected results depending on the timezone and the current time.

For example, at 00:30 in timezone CET (UTC+1) Date.yesterday will be two days before Date.today. In other cases, Date.today and Date.yesterday can have the same value.

Upvotes: 2

Andrew Marshall
Andrew Marshall

Reputation: 96964

TL;DR: Date.today uses the system’s local time zone. If you require it be in UTC, instead get the date from a UTC time, e.g. Time.now.utc.to_date.


Dates do not have timezones, since they don't represent a time.

That said, as for how it calculates the current day, let's look at this extract from 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");

It then proceeds to use use tm to create the Date object. Since tm contains the system's local time using localtime(), Date.today therefore uses the system's local time, not UTC.


You can always use Time#utc on any Time convert it in-place to UTC, or Time#getutc to return a new equivalent Time object in UTC. You could then call Time#to_date on that to get a Date. So: some_time.getutc.to_date.

If you’re using ActiveSupport’s time zone support (included with Rails), note that it is completely separate from Ruby’s time constructors and does not affect them (i.e. it does not change how Time.now or Date.today work). See also ActiveSupport extensions to Time.

Upvotes: 60

Arnold Roa
Arnold Roa

Reputation: 7728

You can use

Date.current

To get the current date on the configured timezone.

Upvotes: 4

bluehallu
bluehallu

Reputation: 10285

If your rails applications is configured to run in time zone UTC then just use Time.zone.today, otherwise force it by using Time.now.utc.to_date

Upvotes: 2

vipulnsward
vipulnsward

Reputation: 1298

You can get away by using

Time.now.utc.to_date

in ruby

Upvotes: 60

Rich Drummond
Rich Drummond

Reputation: 3519

An instance of Date is represented as an Astronomical Julian Day Number; it has no fractional part of a day. While a Julian Day is relative to GMT - so technically an instance of Date should be considered to be in GMT - for most purposes you can ignore that and treat it as having no timezone. You would only care about a time zone if you converted it to a DateTime or Time.

ActiveSupport's tools for date conversion let you specify whether you want local time or UTC.

E.g.:

>> 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"

Upvotes: 11

Related Questions