【问题标题】:Rails 4 - How to properly display times across timezones?Rails 4 - 如何正确显示跨时区的时间?
【发布时间】:2015-06-02 17:55:11
【问题描述】:

我正在开发一个用户创建事件的应用程序。对于每个事件,我都会使用倒计时 - 因此页面上会显示距离事件开始还有多少时间(小时、分钟和秒)。

我在荷兰 (+1h),所以当我创建一个事件并将其设置为 3 月 29 日 19:45 开始,然后查看数据库时,我看到以下内容(列是 datetime):

2015-03-29 19:45:00

但是当我加载页面时,它显示该事件将始终在 1 小时后开始。如何处理这种行为?

另外,我还想问一件事 - 假设我将活动的开始时间设置为 19:45。如何确保在加利福尼亚(比荷兰晚 9 小时)浏览我的网站的人看到正确的时间(此人应该在 10:45 而不是 19:45 看到活动开始)。

谢谢,我没有认真地处理时区/时区问题。

PS:我用于应用程序的服务器位于阿姆斯特丹(DigitalOcean 服务器)。

【问题讨论】:

  • 您是说显示的时间总是比数据库中的时间晚一小时吗?能否展示一些代码,以便我们查看您使用的方法?
  • @JoshLeitzel 就像这样= e.event_start - 如果我这样打印日期时间,那么日期时间将如何在加利福尼亚看到一个人? 19:45 还是 10:45?
  • 你找到解决办法了吗?

标签: ruby-on-rails ruby date time utc


【解决方案1】:

这可能是因为您在数据库表中以 UTC 格式保存时间并将应用程序时间设置为 GMT。在 Rails 控制台中检查您的 Time.zone。

【讨论】:

    【解决方案2】:

    Rails 很可能会使用您服务器的时区,除非您在应用程序的配置中明确指定它。

    为了支持能够让您在不同时区呈现正确时间的行为,您需要了解 TZ 用户所在的位置(以便正确显示)。

    为此,您有 2 个选择:

    选项 B(后端 + 前端)

    • 在数据库中以 UTC 存储时间
    • 将应用程序的默认时区设置为 UTC(这将使它以 UTC 呈现)
    • 在前端使用JS将记录的日期时间转换为用户的时区(可以使用Moment Timezone JS library

    选项 B(所有服务器端)

    • 在数据库中以 UTC 存储时间
    • 获取用户的时区(即在配置文件设置中存储用户的时区)
    • 将 UTC 日期时间从记录转换为用户的时区并渲染

    我会推荐选项 A,尤其是如果您没有用户配置文件,这可能是构建此功能的唯一可行方法。

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 2016-04-15
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多