使用 Rails 处理 UTC 中的日期时间 + 时区输入

processing a datetime + timezone inputs into UTC with rails

提问人:Jerome 提问时间:9/24/2023 更新时间:9/25/2023 访问量:43

问:

Ruby 和 rails 有许多方法可以解析带有时区信息的日期时间,但缺乏同时输入两者的集成机制 AFAIK,然后解析要求使情况更加复杂。

应用程序以 UTC 格式保存时间戳,出生日期将具有时区组件 以及另一个属性,用于提供时区的偏移量。

    t.timestamptz "birth_date"
    t.string "birth_date_tz"

问题在于正确处理参数。用户不是以 UTC 术语思考,而是以给定时区的时钟思考。

因此,需要先将以下参数进行偏移才能转换为 UTC

  Parameters: {"authenticity_token"=>"[FILTERED]", "individual"=>{"birth_date(3i)"=>"1",  
"birth_date(2i)"=>"1", "birth_date(1i)"=>"1987", "birth_date(4i)"=>"01",  
"birth_date(5i)"=>"01", "birth_date_tz"=>"Hawaii",, "birth_location_city"=>"Honolulu"}

并希望避免保存,然后更新。

这些应该如何处理?

(稍后将查看它们,重新翻译以偏移 tz)

Ruby-on-Rails 日期时间 时区

评论

0赞 Matt Johnson-Pint 9/26/2023
出生日期没有时区。它只是一个日期(年、月、日)。出生地点和时间与一个人的“年龄”无关,就像通常的计算方式一样。在计算年龄时,唯一重要的时区是一个人当时的实际位置 - 因为这决定了这个人对当前日期的想法是什么。
0赞 Matt Johnson-Pint 9/26/2023
换言之,是不适合出生日期的数据库类型。在大多数数据库中,正确的类型只是 ,不应将其转换为 UTC 或从 UTC 转换。timestamptzdate
0赞 Matt Johnson-Pint 9/26/2023
我应该警告我之前的评论 - 如果你想确定一个人多少,那么出生的时间和时区是无关紧要的。但是,如果您试图计算一个人的年龄(例如出于占星术目的等),它们确实是相关的。

答:

0赞 smathy 9/25/2023 #1

是的,很明显,当用户输入数据时,应用程序无法知道用户脑海中的时区,尽管您可以在 Javascript 中检测他们当前浏览器时间的偏移量,但无论如何您都无法可靠地将其转换为时区。

所以是的,在你完成作业后,只需:

individual.birth_date.change zone: individual_params[:birth_date_tz]

FWIW,话虽如此,出生日期实际上没有时区。如果你出生在纽约的午夜过后,你的出生日期不是你在加利福尼亚的前一天。