将字符串转换为日期时间

120

我需要将以下字符串解析为DateTime对象:


30/Nov/2009:16:29:30 +0100

有没有简单的方法可以做到这一点?

PS:我希望按原样转换上述字符串。年份后面的冒号不是打错了。我也想用Ruby而不是RoR解决这个问题。

8个回答

127

这个不也适用于Rails吗?

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

在我使用的MRI Ruby 1.9.2上仍然存在这个问题,当我发布这段代码片段时可能应该提到这一点。 - xentek
1
使用Ruby 1.9.3,在Rails 3.2.3中运行良好... "2012-05-16 02:30 UTC".to_datetime => Wed, 16 May 2012 02:30:00 +0000 - Tilo
71
这也是一个 Ruby on Rails 的方法,而不是 Ruby 的方法。 - JackCA
7
这应该是:require 'active_support/all'然后"30/Nov/2009 16:29:30 +0100".to_datetime(实际上您并不需要所有的active_support扩展,但祝您好运选择需要的扩展)。 - Matt Zukowski
4
ActiveSupport的布局非常合理,但为了最小化影响,这应该是你所需要的,以将 to_datetime 添加到 String 对象中: require 'active_support/core_ext/string/conversions' - xentek
3
这个问题是关于“30/Nov/2009:16:29:30 +0100”而不是“30/Nov/2009 16:29:30 +0100”的,这也是为什么它不能工作的另一个原因。 - schmijos

116

DateTime.strptime 允许你指定日期时间的格式并将字符串转换为日期时间。


1
感谢。错过了我可以自己格式化它的机会。这是工作正常的格式:'%d/%b/%Y:%H:%M:%S' - SkaveRat
1
@SkaveRat 你的字符串是否考虑了时区?我使用 %d/%b/%Y:%H:%M:%S %Z - knut
4
以下是可用格式缩写的列表链接:https://gist.github.com/halloffame/5350249 - Ryan
14
请指明一个字符串转换的实例,这是用户所询问的,仅仅回答“去那里看”是不礼貌的(而且那里有很多信息)。Stackoverflow之所以流行,并不是因为它提供外部文档的链接,而是因为它回答了问题。 - Daniel Garmoshka
有没有办法进行“精确匹配”?目前的行为是“从开头匹配”,因此%Y将匹配2015(如预期)和2016-foo-bar,因为它在看到2016时停止。这种行为与C语言对应物一致;但是,C函数返回匹配结束的位置(例如“2016”情况下的第一个“ - ”),以便我们决定匹配是否精确;在Ruby中,它返回一个DateTime,因此我们无法确定后面是否还有任何内容。 - Franklin Yu

55

我已经成功地使用过以下技术:

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

26

24
这是一个Ruby on Rails的方法,而不是一个纯Ruby的方法。 - JackCA
2
虽然这不是这个问题的答案,但它对我有很大帮助。谢谢 @user1425976 - karlingen
为什么有些人在Ruby问题上发布Rails的内容? - Zeeshan

16

将字符串转换为日期:

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

# with specified timezone
DateTime.strptime('2012-12-09 00:01:36 +8', '%Y-%m-%d %H:%M:%S %z')
=> Sun, 09 Dec 2012 00:01:36 +0800

请参考: https://ruby-doc.org/stdlib-3.1.1/libdoc/date/rdoc/Date.html


为什么这是针对中国的Rails开发者而不是其他国家的Rails开发者? - ggorlen
1
因为我认为美国和其他国家的人喜欢使用27/09/2021这种日期格式。而对于中国人来说,我们只使用yyyy-mm-dd格式。 - Siwei
我明白了,谢谢你澄清。我猜想也许其他地区也使用这种格式,这对我来说更有意义。在美国,我们通常使用9/27/2021这样的格式,这和我们的度量单位一样奇怪。 - ggorlen

15

我使用了Time.parse("02/07/1988"),和其他帖子中的一些人类似。

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

这是在Ruby 2.2下的情况。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接