2

我不知道我做错了什么。我已经遵循了很多例子,但我无法解决这个问题。我有一个字符串,时间如下:

text_t = 美国东部时间下午 1:00

我尝试将其转换为 DateTime 对象,以便可以使用以下代码轻松地将 30 分钟添加到该值:

  text_next = DateTime.strptime(text_t, '%I:%M %p %Z')
  puts text_next
  text_next = text_next + 1800
  puts text_next

但我的输出如下所示:

1:00 PM ET
2013-07-02T13:00:00+00:00
2018-06-06T13:00:00+00:00

我需要将时间增加 30 分钟,然后将其转换回与传入格式相同的字符串。我可以创建一个函数将字符串操作为提前 30 分钟,但我觉得这需要做很多工作必须是提供此功能的东西。

4

3 回答 3

4

您正在将 1800 天添加到您的日期。

我试过这个:

text_next = DateTime.strptime(text_t, '%I:%M %p %Z')
puts text_next
text_next = text_next + Rational(30, 1440)
puts text_next

1440 是一天中的分钟数。

于 2013-07-02T17:44:29.550 回答
0

这是我将遵循的方法:

require 'date'

text_t = '2:12:03 PM ET'
dt = DateTime.parse(text_t, '%I:%M %p %Z')
# => #<DateTime: 2013-07-03T14:12:03+00:00 ((2456477j,51123s,0n),+0s,2299161j)>
dt.to_s
# => "2013-07-03T14:12:03+00:00" # !> invalid offset is ignored
dh = Date._strptime(dt.to_s,'%Y-%m-%dT%H:%M:%S%z')
# => {:year=>2013,
#     :mon=>7,
#     :mday=>3,
#     :hour=>14,
#     :min=>12,
#     :sec=>3,
#     :zone=>"+00:00",
#     :offset=>0}

dh[:hour] += 30 # => 44
dh
# => {:year=>2013,
#     :mon=>7,
#     :mday=>3,
#     :hour=>44,
#     :min=>12,
#     :sec=>3,
#     :zone=>"+00:00",
#     :offset=>0}

dh.values[0..-2].join(" ")
# => "2013 7 3 44 12 3 +00:00"
DateTime.ordinal(*dh.values[0..-3])
# => #<DateTime: 2013-01-07T03:44:12+00:00 ((2456300j,13452s,0n),+0s,2299161j)>

现在它是您的选择,您希望如何查看您的Date对象。

于 2013-07-02T19:42:13.860 回答
0

关于什么?只要您使用 activesupport 当然

text_t = "1:00 PM ET"
text_next = DateTime.strptime(text_t, '%I:%M %p %Z')
text_next = text_next + 30.minutes
于 2013-07-02T17:40:11.563 回答