惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
博客园 - Franky
MyScale Blog
MyScale Blog
L
LangChain Blog
Martin Fowler
Martin Fowler
Recent Announcements
Recent Announcements
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
量子位
A
About on SuperTechFans
C
Check Point Blog
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
I
InfoQ
V
Visual Studio Blog
Vercel News
Vercel News
B
Blog
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
U
Unit 42

Nic Lin's Blog

謝明真 - 高效領導力的課後筆記 NFT 開發實戰!基礎智能合約入門 (3) NFT 開發實戰!基礎智能合約入門 (2) NFT 開發實戰!基礎智能合約入門 (1) 如何自我檢測 log4j CVE 漏洞 Rails 如何在資料寫入時記錄來源 IP 位置 如何經營工程師 Youtube 頻道 - Part 8 營收篇 如何經營工程師 Youtube 頻道 - Part 7 酸民文化篇 如何經營工程師 Youtube 頻道 - Part 5 設備器材篇 如何經營工程師 Youtube 頻道 - Part 4 後製剪輯篇 如何經營工程師 Youtube 頻道 - Part 3 文案企劃篇 如何經營工程師 Youtube 頻道 - Part 2 設備器材篇 如何經營工程師 Youtube 頻道 - Part 1 制訂頻道方向篇 如何經營工程師 Youtube 頻道 - Part 0 Rails 中避免 race condition 的最佳實踐(二) Rails 中避免 race condition 的最佳實踐(一) 10 分鐘整合 google sheet 做自動化開發功能週報 經營 Side Project 300 天所帶來的收穫及挑戰 我的 Youtube 影片製作流程 API 設計時必須注意的 HTTP header 底線問題 如何提升你的程式可讀性之實務技巧(三) 如何提升你的程式可讀性之實務技巧(二) 如何提升你的程式可讀性之實務技巧(一) Ruby 中使用 freeze 優化效能的時機 避免 React 中的 useEffect 無限 render 在 Rails 內輕量使用 Vue Component 的最佳實踐 如何在區域網路用 Docker 架設有 SSL 的 Gitlab 從被問到問人,那些我常問的面試問題 [Rails] 如何漂亮寫出可維護的 query (Maintainable Rails Query) 在已知長度情況下優化 slice 的性能
Rails 要用 Time.zone.now 還是 Time.now
Nic Lin · 2019-06-27 · via Nic Lin's Blog

我自己主觀喜歡用 Time.zone.now

原因

  1. 在 Rails best practice 裡有提到
  2. 把時區的設定放在 application layer 而不是機器上
  • Time.now 抓的是機器時間
  • Time.zone.now 抓的是 Rails 下設定的 config.time_zone 時區

如果機器沒設定好,不管是 development / production 又或是多機器的部分,就有可能顯示不一樣。

而時間的格式應該仰賴在 application layer, 這樣更容易保持一致性

可以在本機測試以下範例

  1. config/application.rb 中的時區替換為 config.time_zone = 'Europe/Istanbul'
  2. 啟動 Rails console
  3. 輸入 Time.now / Time.zone.now 查看
# 我已經改為非 asia 時區,但他抓的是我機器上的時區
pry(main)> Time.now
=> 2019-06-26 14:24:08 +0800

# 下面這個應該才是對的
pry(main)> Time.zone.now
=> Wed, 26 Jun 2019 09:24:05 +03 +03:00

但是寫進 database 時都是會轉 UTC,其實你不管用 Time.now / Time.zone.now 其實都可以。

如果你機器上設定的時區和 Rails 裡一樣,那麼這兩個方法其實出來的結果是一致的。

那為什麼還是推薦用 Time.zone.now ?

舉個例子,也許不會發生,但可以想想

如果機器有很多台,可能某一台在當初開的時候沒設定好時區。

那麼在 database 寫入時,不用擔心,不會有事,不管 zone 是什麼,都會寫入當下時間並轉為 UTC,因為 db 不負責記錄 zone。

但是顯示的部分,可能就會有雷。

比方說

A 機器被設錯了,是歐洲時區。 B 機器是對的,是亞洲時區。

你有一個頁面是透過 load balance 進來,所以用戶有可能連到 A 也有可能是 B

你有頁面的邏輯是顯示現在的時間 + 30.mintues。

可以想一下 A 和 B 機器分別在頁面上顯示的結果

  • Time.now + 30.mintues
  • Time.zone.now + 30.mintues

定然是不一樣的吧?

所以如果你不想區分,model 寫 Time.now而 View / API output 寫 Time.zone.now

那我認為就統一寫 Time.zone.now 並把 Rails 時區設定好,大家就更方便做事囉。

參考資源