Ruby on rails 如何在ruby中将MM/DD/YYYY转换为时间?

Ruby on rails 如何在ruby中将MM/DD/YYYY转换为时间?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的日期格式如下: MM/DD/YYYY H:MMPM(不确定如何表示PM) 如何将其转换为Ruby datetime表示形式?您应该能够将该字符串直接发送到时间中 2.0.0-p247 :001 > require 'time' => true 在Ruby 1.9之前: 2.0.0-p247 :002 > Time.parse("12/1/2014 5:55PM") => 2014-12-01 17:55:00 -0500 Ruby 1.9之后 2.0.0-

我的日期格式如下:

MM/DD/YYYY H:MMPM
(不确定如何表示PM)


如何将其转换为Ruby datetime表示形式?

您应该能够将该字符串直接发送到
时间中

2.0.0-p247 :001 > require 'time'
 => true 
在Ruby 1.9之前:

2.0.0-p247 :002 > Time.parse("12/1/2014 5:55PM")
 => 2014-12-01 17:55:00 -0500 
Ruby 1.9之后

2.0.0-p247 :002 > Time.strptime("12/1/2014 5:55PM","%m/%d/%Y %I:%M%p")
 => 2014-12-01 17:55:00 -0500 

在rails中,您只需调用
.to\u time
字符串,它就会将其解析为时间对象

2.1.2 :002 > "12/1/2014 5:55PM".to_time
 => 2014-01-12 17:55:00 -0500 

当不能依赖ISO 8601这样的格式时,我喜欢在解析日期和时间时显式地表示,因为它们可以用许多不同的方式表示。使用

当时的注意事项:

  • 使用%I(“一天中的小时,12小时时钟(01..12)”),而不是%H(表示24小时时间)
  • 使用%M(“小时分(00..59)”),而不是%M(即月份)
  • 使用%p(“子午线指示器(AM/PM)”),而不是%p(表示“AM/PM”)
从上面解析的时间将有一个0/UTC的TZ-解决可能的蠕虫问题是另一个问题,可能最简单的方法是只解析包含偏移量的原始字符串

tzoff = "-08:00"
d = Time.strptime("#{str} #{tzoff}", '%m/%d/%Y %I:%M%p %z')
d.localtime(tzoff)  # move back to the right localtime
# d => 2014-12-01 17:55:00 -0800

不要为此使用
parse
方法或任何基于它的方法

在美国,我们使用“MM/DD/YYYY”,但Ruby更具通用性,它假设为“DD/MM/YYYY”,如果一天超过12天,可能会导致很多故障。它还将反转您的日和月值

如果今天是'2000年1月2日',
parse
将在基于美国的日期字符串中向后获取日期/月份:

DateTime.parse('1/2/2000 12:00AM') # => #<DateTime: 2000-02-01T00:00:00+00:00 ((2451576j,0s,0n),+0s,2299161j)>
Ruby假设今天是第一天:

DateTime.parse('31/12/2000 12:00AM') # => #<DateTime: 2000-12-31T00:00:00+00:00 ((2451910j,0s,0n),+0s,2299161j)>
DateTime.parse('31/12/2000 12:00AM')#=>#
试图通过嗅探日期字符串来解决这种情况将失败。确保正确解析日期字符串的唯一方法是了解用户或生成该字符串的软件使用的日期格式,或者始终使用定义为特定格式的基于ISO的字符串

相反,放弃任何依赖猜测的便利,告诉Ruby使用什么格式:

require 'date'

DateTime.strptime('12/31/2000 12:00AM', '%m/%d/%Y %H:%M%p') 
# => #<DateTime: 2000-12-31T00:00:00+00:00 ((2451910j,0s,0n),+0s,2299161j)>
需要“日期”
DateTime.strtime('12/31/2000 12:00AM','%m/%d/%Y%H:%m%p')
# => #

Ruby有那么聪明吗?太神了知道如何指定时区偏移量吗?@kidcapital您可以通过短码(即
EST
/
CST
)或偏移量(
-0400
)在字符串中指定时区。@user2864740,从Ruby 1.9.3
time开始。parse
不再解析美式日期(MM/DD/YYYY)。请注意,在示例中,它解析为非US样式(DD/MM/YYYY)。要将US样式解析为默认样式,您需要安装@infused is correct-很好。我已经修改了我的示例,使其更加清晰,如果您使用Rails,您可以使用
时间。如果您处理的是特定时区,请使用\u zone
。例如,
Time.use_zone('EST'){Time.zone.parse(“08/01/2014 5:00”)}
。只需确保在块内使用的是
Time.zone
。我认为这与OP想要的解析不正确。它们使用MM/DD/YY格式
DateTime.parse('31/12/2000 12:00AM') # => #<DateTime: 2000-12-31T00:00:00+00:00 ((2451910j,0s,0n),+0s,2299161j)>
require 'date'

DateTime.strptime('12/31/2000 12:00AM', '%m/%d/%Y %H:%M%p') 
# => #<DateTime: 2000-12-31T00:00:00+00:00 ((2451910j,0s,0n),+0s,2299161j)>