Giả sử project rails của bạn set timezone là 'Tokyo' (có múi giờ 9 so với UTC 0):

# config/application.rb

...
config.time_zone = 'Tokyo'
...

 

  • Gọi Time.nowDateTime.now sẽ không trả về cho bạn thời gian của Tokyo mà là thời gian của timezone hiện tại, nghĩa là nếu bạn thực hiện câu lệnh đó trên server đang chạy ở Tokyo thì sẽ trả về thời gian hiện tại của Tokyo, nếu bạn đang thực hiện câu lệnh đó trên deploy server có múi giờ 0 thì nó sẽ trả về thời gian hiện tại của  UTC 0.
# Giả sử thời gian ở Tokyo hiện tại là "2018-06-26 13:54:54 JST +09:00" 


# Nếu bạn đang thực hiện câu lệnh dưới đây trên server chạy local đang ở tokyo
Time.now
# => 2018-06-26 13:54:54 +0900
DateTime.now
# => Tue, 26 Jun 2018 13:54:54 +0900


# Nếu bạn đang thực hiện câu lệnh dưới đây trên server được deploy trên ec2 aws (có timezone là UTC+0)
Time.now
# => 2018-06-26 04:54:54 +0000
DateTime.now
# => Tue, 26 Jun 2018 04:57:00 +0000
  • Nếu bạn muốn gọi thời gian của Tokyo thì gọi bằng các cách sau:
# Giả sử thời gian ở Tokyo hiện tại là "2018-06-26 13:54:54 JST +09:00"

Time.zone.now
# => Tue, 26 Jun 2018 13:54:54 JST +09:00

Time.current
# => Tue, 26 Jun 2018 13:54:54 JST +09:00

Hàm Time.current phía trên sẽ trả về Time.zone.now nếu zone được set, còn nếu zone không được set thì hàm đó sẽ trả về Time.now.

  • Khi bạn lấy thời gian từ record trong DB ở rails thì thời gian sẽ được tự động convert sang Tokyo cho bạn:
# Giả sử record đầu tiên của bảng submissions trong DB có created_at = "2018-06-26 05:06:09"

sub = Submisison.first
sub.created_at
# => Tue, 26 June 2018 14:06:09 JST +09:00
  • Khi gọi query DB từ rails thì Time.zone.now và Time.current sẽ được tự động convert thành Time.now 
# Giả sử record đầu tiên của bảng submissions trong DB có created_at = "2018-06-26 05:06:09"
# Giờ hiện tại ở Tokyo là "2018-06-26 14:06:09"

Submission.where('created_at < ?', Time.current).last
# => SELECT  "submissions".* FROM "submissions" WHERE (created_at < '2018-06-26 05:06:09.861351') ORDER BY id ASC LIMIT 1