如何比较红宝石不同区域中的两个日期

时间:2019-05-30 14:23:28

标签: ruby

如何在红宝石的不同时区比较这两个日期

代码:

if (mydate.to_datetime -
        (120).minutes).to_datetime >
            DateTime.now

puts mydate # 2019-05-30 20:42:34
mydate.to_time # 2019-05-30T20:42:34+00:00
# after subtracting 120 minutes 2019-05-30T18:42:34+00:00
puts DateTime.now # 2019-05-30T20:24:12+05:30

我需要从mydate减去120分钟,然后与currentdate进行比较。

2 个答案:

答案 0 :(得分:1)

Time.parse可以正确处理时区:

2.5.1 :001 > require 'time'
 => true 
2.5.1 :002 > t1 = Time.parse('2019-05-30T19:37:18+00:00')
 => 2019-05-30 19:37:18 +0000 
2.5.1 :003 > t2 = Time.parse('2019-05-30T19:37:30+05:30')
 => 2019-05-30 19:37:30 +0530 
2.5.1 :004 > t1 > t2
 => true 
2.5.1 :005 > t2 > t1
 => false 
2.5.1 :006 > t1 == t2
 => false 
2.5.1 :007 > t1 - t2
 => 19788.0 # result is in seconds, convert to whatever you need

假设您已经将这两个变量声明为DateTime实例,其中t12019-05-30T19:37:18+00:00,而t22019-05-30T19:37:30+05:30,则可以直接运行比较并获取使用.to_time

以秒为单位的结果
2.5.1 :009 > t1 > t2
 => true 
2.5.1 :010 > t2 > t1
 => false 
2.5.1 :011 > t1 == t2
 => false
2.5.1 :012 > t1.to_time - t2.to_time
 => 19788.0 

答案 1 :(得分:1)

以天为单位的差异:

%w[2019-05-30T19:37:18+00:00 2019-05-30T19:37:30+05:30].
  map { |d| DateTime.iso8601(d) }.reduce(:-)
#⇒ (1649/7200)

小时:

%w[2019-05-30T19:37:18+00:00 2019-05-30T19:37:30+05:30].
  map { |d| DateTime.iso8601(d) }.reduce(:-) * 24
#⇒ (1649/300)

在几分钟内:

%w[2019-05-30T19:37:18+00:00 2019-05-30T19:37:30+05:30].
  map { |d| DateTime.iso8601(d) }.reduce(:-) * 24 * 60
#⇒ (1649/5)

结果为Rational,以保持准确性。可能会将其转换为整数,浮点数或十进制。