将字符串转换为日期时间

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

【讨论】:

以上是关于将字符串转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

无法将字符串转换为日期和日期转换为字符串 Swift 5.2

将日期时间转换为字符串 PHP

将字符串日期时间转换为熊猫日期时间

Python将日期时间字符串转换为日期

将 JSON 日期字符串转换为 Python 日期时间

将日期字符串转换为正确的格式