【问题标题】:Get time difference in minutes in rails the most effective way以最有效的方式在 Rails 中获取时差(以分钟为单位)
【发布时间】:2015-04-27 03:39:29
【问题描述】:

在我的 Rails 应用程序中,我有一个名为 Schedule 的表,其中包含一个名为到达的字段,我在其中输入了时间,我猜出于某种原因它默认以以下格式存储在 UTC 中

2000-01-01 07:37:00 UTC

在我的控制器中,当我执行 Time.now 之类的操作时,我会得到这样的时间

2015-04-26 23:35:46 -0400

我的问题是需要两次都在同一个区域或其他东西,这样我才能计算出差异。

我知道我可以在 Time.now 上添加 4 小时并使其成为 UTC,但我仍然如何在几分钟内获得它们之间的差异?我想到了一个愚蠢的技巧,如果我将 4 小时添加到 Time.now 它将变为 UTC,然后减去两者之间的差异。但是存储在 db 中的时间有 2001 日期,而这个有 2015 日期,所以它会工作吗?我会建议您的答案或方法。谢谢

【问题讨论】:

  • “由于某种原因它被存储在 UTC”是 Rails 中的标准行为。 Time 和 DateTime 始终转换为 UTC 并作为 UTC 存储在数据库中。
  • 它怎么会存储日期 2000 ?我不明白
  • 是的,错误的年份绝对不是标准行为。您是使用 MySQL Workbench 直接查看数据库,还是通过您的应用程序检查日期?如果是这样,您确定您没有在存储日期之前对其进行操作吗?

标签: mysql ruby-on-rails ruby


【解决方案1】:

这不是问题,Ruby 在内部处理时区。

time1 = DateTime.parse('2000-01-01 10:00:00 UTC')
time2 = DateTime.parse('2000-01-01 10:00:00 -0100')
time2 - time1
# => (1/24)

即Ruby 已经知道 UTC 和 -0100 的同一时间之间的差异是一小时。时差运算符已经在做正确的事了,如果你允许的话:)

但是,DateTime 是 Ruby,Time 是 C - 前者有更好的 API 并且可以很好地处理数据库,但后者更快。

编辑:这是一个使用 Time 的示例,仍然相同:

time1 = Time.new(2000, 1, 1, 10, 0, 0, "+00:00")
time2 = Time.new(2000, 1, 1, 10, 0, 0, "-01:00")
time2 - time1
# => 3600.0

编辑:年2999 2000

【讨论】:

  • 在我的情况下,一个日期为 2015 年,另一个日期为 2000 年,所以如果我对这两种情况都执行 DateTime.parse 并取不同,我应该在几分钟内得到我的结果?非常感谢这个很棒的解释
  • 不,DateTime#- 给您提供Rational 的日子。 Time#- 会给你几秒钟的时间作为Float
猜你喜欢
  • 2013-11-04
  • 2010-09-26
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多