将字符串转换为日期时间
Posted
技术标签:
【中文标题】将字符串转换为日期时间【英文标题】:convert String to DateTime 【发布时间】:2011-01-13 03:16:55 【问题描述】:我需要将以下字符串解析为 DateTime 对象:30/Nov/2009:16:29:30 +0100
有没有简单的方法可以做到这一点?
PS: 我想按原样转换上面的字符串。年份后的冒号不是错字。我也想用 Ruby 而不是 RoR 来解决问题。
【问题讨论】:
【参考方案1】:这难道不应该也适用于Rails吗?
"30/Nov/2009 16:29:30 +0100".to_datetime
【讨论】:
使用 Ruby 1.9.3 在 Rails 3.2.3 中运行良好 ... "2012-05-16 02:30 UTC".to_datetime => 2012 年 5 月 16 日星期三 02:30:00 +0000 这也是 Ruby on Rails 方法,不是 Ruby 方法。 这应该是:require 'active_support/all'
,然后是 "30/Nov/2009 16:29:30 +0100".to_datetime
(您实际上并不需要所有的 active_support 扩展,但祝您有选择地找出需要哪些扩展)
ActiveSupport 的布局相当合理,但为了尽量减少影响,这应该是您将 to_datetime
添加到 String
对象所需的全部内容:require 'active_support/core_ext/string/conversions'
问题是关于“30/Nov/2009:16:29:30 +0100”而不是“30/Nov/2009 16:29:30 +0100”。这是它不起作用的另一个原因。【参考方案2】:
DateTime.strptime 允许您指定格式并将字符串转换为日期时间。
【讨论】:
谢谢。错过了,我可以给它我自己的格式。这是有效的:'%d/%b/%Y:%H:%M:%S' @SkaveRat 您的字符串是否尊重时区?我用%d/%b/%Y:%H:%M:%S %Z
查看可用格式缩写列表gist.github.com/halloffame/5350249
指定字符串转换的例子是礼貌的,用户要求,不仅仅是“去那里阅读”(顺便说一下,哪里有大量信息)。 *** 流行不是因为它提供外部文档的链接,而是提供问题的答案
有没有办法做到“精确匹配”?当前行为是“从头开始匹配”,因此%Y
将匹配2015
(如预期)和2016-foo-bar
,因为它在看到2016
时停止。这种行为与 C 对应物一致;但是,C 函数 returns the position of the end of matching(例如“2016”案例中的第一个 -
)供我们判断匹配是否准确;在 Ruby 中它返回一个DateTime
,所以我们无法判断之后是否还有任何东西。【参考方案3】:
我已经成功了:
require 'time'
t = Time.parse(some_string)
【讨论】:
【参考方案4】:如果使用 Rails,这会将日期中的字符串转换为日期时间:
"05/05/2012".to_time
文档参考:https://apidock.com/rails/String/to_time
【讨论】:
这是 Ruby on Rails 方法,而不是 Ruby 方法。 虽然这不是这个问题的答案,但它帮助了我很多。谢谢@user1425976 为什么人们会发布关于 Ruby 问题的 Rails 内容?【参考方案5】:我使用了Time.parse("02/07/1988")
,就像其他一些海报一样。
一个有趣的问题是我打开 IRB 时默认加载了 Time
,但未定义 Time.parse
。我必须require 'time'
才能让它工作。
Ruby 2.2 就是这样。
【讨论】:
【参考方案6】:对于中国 Rails 开发者:
DateTime.strptime('2012-12-09 00:01:36', '%Y-%m-%d %H:%M:%S')
=> Sun, 09 Dec 2012 00:01:36 +0000
【讨论】:
为什么这适用于中国的 Rails 开发者而不是其他国家的 Rails 开发者? 因为我认为美国和其他国家的人喜欢 27/09/2021 这种日期格式。对于中文,我们只使用 yyyy-mm-dd 格式。 我明白了——感谢您的澄清,我认为是这样的。我认为世界其他地方也使用这种格式,这对我来说更有意义。在美国,我们通常使用 2021 年 9 月 27 日,这和我们的测量单位一样奇怪。【参考方案7】:在 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
【讨论】:
【参考方案8】:您也可以解析具有给定时区的日期时间字符串:
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
【讨论】:
以上是关于将字符串转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章