将String转换为DateTime


98

我需要将以下String解析为DateTime对象:
30/Nov/2009:16:29:30 +0100

是否有捷径可寻?

PS:我想按原样转换上面的字符串。一年后的冒号不是错字。我也想用Ruby而不是RoR解决问题。

Answers:


99

DateTime.strptime允许您指定格式并将String转换为DateTime。


1
谢谢。错过了,我可以自己指定格式。这里的工作之一: '%d /%B /%Y:%H:%M:%S'
SkaveRat

1
@SkaveRat您的字符串是否遵守时区?我使用%d/%b/%Y:%H:%M:%S %Z
knut

4
有关可用格式缩写的列表,请 参见gist.github.com/halloffame/5350249
Ryan

8
礼貌地指定用户要求的字符串转换示例,而不仅仅是“去那里读”(顺便说一下,这里有很多信息)。Stackoverflow受欢迎的原因不是因为它提供了指向外部文档的链接,而是提供了问题的答案
Daniel Garmoshka

有什么办法可以做“完全匹配”?当前,行为是“从头开始匹配”,因此%Y将同时匹配2015(按预期),并且2016-foo-bar因为它在看到时会停止2016。此行为与C对应对象一致;但是,C函数返回匹配结束的位置(例如-,“ 2016”案例中的第一个),以便我们确定匹配是否准确;在Ruby中,它会返回DateTime,因此我们无法确定之后是否还有任何内容。
富兰克林·于

97

这不行吗?

"30/Nov/2009 16:29:30 +0100".to_datetime

1
使用Ruby 1.9.3在Rails 3.2.3中可以很好地工作...“ 2012-05-16 02:30 UTC” .to_datetime => 2012年5月16日,星期三02:30:00 +0000
Tilo

58
这也是Ruby on Rails方法,而不是Ruby方法。
JackCA'6

5
这应该是: require 'active_support/all' 然后 "30/Nov/2009 16:29:30 +0100".to_datetime (您实际上并不需要所有的active_support扩展,但祝您好运找出有选择地需要哪些扩展)
Matt Zukowski 2012年

2
ActiveSupport的布局非常合理,但是为了使影响最小,这就是to_datetime添加到String对象上所需的全部:require 'active_support/core_ext/string/conversions'
xentek 2013年

3
问题是关于“ 30 / Nov / 2009:16:29:30 +0100”,而不是“ 30 / Nov / 2009 16:29:30 +0100”。这是它不起作用的另一个原因。
schmijos 2014年

45

我在以下方面取得了成功:

require 'time'
t = Time.parse(some_string)

15

Time.parse("02/07/1988")和其他一些海报一样使用过。

一个有趣的陷阱是Time在我打开IRB时默认加载的,但Time.parse未定义。我必须require 'time'让它工作。

Ruby 2.2就是这样。


12

这会将date中的字符串转换为datetime:

"05/05/2012".to_time

20
这是Ruby on Rails方法,而不是Ruby方法。
JackCA'6

1
尽管这不是这个问题的答案,但它帮了我很多。感谢@ user1425976
karlingen 2014年

10

对于中国的Rails开发人员:

DateTime.strptime('2012-12-09 00:01:36', '%Y-%m-%d %H:%M:%S')
=> Sun, 09 Dec 2012 00:01:36 +0000

5

在Ruby 1.8中,ParseDate模块将转换此日期格式和许多其他日期/时间格式。但是,在年份和小时之间,它不能很好地处理冒号。假设冒号是一个错字并且实际上是一个空格,那么:

#!/usr/bin/ruby1.8

require 'parsedate'

s = "30/Nov/2009 16:29:30 +0100"
p Time.mktime(*ParseDate.parsedate(s))    # =>  Mon Nov 30 16:29:30 -0700 2009

1

您还可以解析具有给定时区的日期时间字符串:

zone = "Pacific Time (US & Canada)"
ActiveSupport::TimeZone[zone].parse("2020-05-24 18:45:00")
=> Sun, 24 May 2020 18:45:00 PDT -07:00
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.