gpt4 book ai didi

ruby-on-rails - Angular JS 和 Rails 中的时区偏移

转载 作者:行者123 更新时间:2023-12-02 03:34:48 26 4
gpt4 key购买 nike

背景:我正在使用 Angular JS 作为 Web 界面和 Rails API 构建一个应用程序。我遇到的问题是将日期从 Angular 传递到 Rails。

问题:我有一个带有出生日期字段的表单,当用户输入他的生日时说 1985 年 3 月 1 日,Angular 将其解释为 1985-03-01 00:00 +0800 (如果您在香港或新加坡)并向 Rails 发送请求。 Rails 对它做的第一件事是将它转换为 UTC,这意味着日期时间现在是 1985-02-28 16:00 UTC。因此,当日期被保存到数据库日期列时,它变成了 1985 年 2 月 28 日。

目前的解决方案:我现在正在做的是在 Angular 方面,我获取时区偏移时间并将其添加到日期中,而不是 1985-03-01 00:00 + 0800,现在是 1985-03-01 08:00 +0800。当 Rails 得到它时,它会转换为 1985-03-01 00:00 UTC 并将正确的日期保存到数据库中。不过,我相信这是解决这个问题的更好选择。

考虑在 Rails 中只解析日期,但我看到的 params[:dob] 在我得到它时已经是 UTC。很想知道是否有比我目前的解决方案更好的做法。感谢您的任何评论和反馈。

最佳答案

这个问题实际上很常见,源于两个独立但相关的问题:

  • JavaScript Date 对象的命名有误。它实际上是一个日期 + 时间对象。

  • JavaScript Date 对象始终具有其运行环境的时区特征。

对于像出生日期这样的仅限日期的值,解决此问题的最佳方法是不向您的服务器发送完整的时间戳。只发送日期部分。

  • 首先,将时间增加 12 小时,使用中午而不是午夜。这是为了避免像巴西这样的时区出现夏令时问题,那里的转换恰好在午夜发生。 (否则,您可能会遇到 DOB 提前一天发布的极端情况。)

  • 然后将值的日期部分输出为 ISO 格式 (YYYY-MM-DD) 的字符串。

例子:

var dt = //  whatever Date object you get from the control
dt.setHours(dt.getHours() + 12); // adjust to noon
var pad = function(n) { return (n < 10 ? '0' : '') + n; }
var dob = dt.getFullYear() + '-' + pad(dt.getMonth()+1) + '-' + pad(dt.getDate());

另一种常见的方法是:

var dt = //  whatever Date object you get from the control
dt.setHours(dt.getHours() + 12); // adjust to noon
dt.setMinutes(dt.getMinutes() - dt.getTimezoneOffset()); // adjust for the time zone
var dob = dt.toISOString().substring(0,10); // just get the date portion

在 Rails 方面,使用 Date对象而不是 DateTime .与 JavaScript 不同,Rails Date 对象是一个仅限日期的对象 - 非常适合生日。

关于ruby-on-rails - Angular JS 和 Rails 中的时区偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24298997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com