コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

ActvieSupportのend_of_**はミリ秒まで設定される

普段は to_i してエポック秒比較しているのに、Time同士でもまぁいっかーとか思ったら降り掛かった厄災系メモ

環境

rails (5.2.0)

事象

end_of_** (end_of_dayやend_of_month)を使うと、対象の切り替わる手前の時刻を引き出してくれるが、その内容は小数点以下にも設定されている

target_time = "2018/12/10 10:00:00".in_time_zone
# => Mon, 10 Dec 2018 10:00:00 JST +09:00

# 当該月の終わりを割り出す
target_time.end_of_month
# => Mon, 31 Dec 2018 23:59:59 JST +09:00

# 小数点以下も見る
target_time.end_of_month.iso8601(3)
# => "2018-12-31T23:59:59.999+09:00"

不幸な事が起こる例

target_time = "2018/12/10 10:00:00".in_time_zone
# => Mon, 10 Dec 2018 10:00:00 JST +09:00

# 対象時間の月末を割り出す
target_time.end_of_month
# => Mon, 31 Dec 2018 23:59:59 JST +09:00

# 年の終わりの時間を設定する
year_limit = "2018/12/31 23:59:59".in_time_zone
# => Mon, 31 Dec 2018 23:59:59 JST +09:00

# 比較したら同じになりそうだがならない
target_time.end_of_month == year_limit
=> false

# 小数点以下に差異がある
"#{target_time.end_of_month.iso8601(3)} == #{year_limit.iso8601(3)}"
# => "2018-12-31T23:59:59.999+09:00 == 2018-12-31T23:59:59.000+09:00"

参考リンク