我需要将表示日期的字符串转换为Ruby中的时间戳对象。
例如:
date_string = "18-Feb-2016 09:01:04"
convert to a timestamp like so
2016-02-18 14:01:04
如果列是类型时间戳,我需要将其保存到mysql数据库。
我在一天中的大部分时间都研究了这个,但找不到解决方案。我知道你可以使用Time.parse,但包括timezone和DateTime.parse()。to_time包括时区。由于它必须是时间戳,我不能使用strftime方法。
我需要时间,因为它将用于计算目的。
非常感谢任何帮助。
谢谢
答案 0 :(得分:4)
TL; DR
datetime = DateTime.parse("18-Feb-2016 09:01:04").to_s(:db)
返回
"2016-02-18 09:01:04"
这是一个快速解释......
<强> 1。将您的字符串转换为DateTime.parse
您可以使用.parse
或Date
类中的DateTime
方法来解析字符串。 parse方法将返回一个Date对象,如下所示:
$ DateTime.parse("18-Feb-2016 09:01:04")
$ => #<DateTime: 2016-02-18T09:01:04+00:00 ((2457437j,32464s,0n),+0s,2299161j)>
.parse
是Ruby提供的方法。
<强> 2。使用DateTime.parse.to_s
Ruby on Rails允许您访问DateTime.to_formatted_s
方法,以便在将Date对象存储到数据库之前更改其格式。
要匹配您指定的格式:
$ datetime = DateTime.parse("18-Feb-2016 09:01:04").to_formatted_s
注意:to_s
是to_formatted_s
的别名,to_formatted_s
是Rails提供的方法,而不是Ruby。
答案 1 :(得分:1)
在Rails中使用to_datetime方法。
"12-10-2015".to_datetime
=&GT;星期一,2015年10月12日10:36:00 +0000
http://apidock.com/rails/String/to_datetime
编辑以添加精确答案。
答案 2 :(得分:1)
您可以使用.to_time
或.to_datetime
,.to_time
会返回带有时区的日期和时间,但.to_datetime
会返回带有周名称的完整日期,但会显示+0000为时区,您将看到两种格式的差异,请参阅以下示例。
# used .to_time
"18-Feb-2016 09:01:04".to_time
## Output
2016-02-18 09:01:04 +0530
# used .to_datetime
"18-Feb-2016 09:01:04".to_datetime
## Output
Thu, 18 Feb 2016 09:01:04 +0000
答案 3 :(得分:1)
我已将问题解释为您希望将字符串"18-Feb-2016 09:01:04"
转换为字符串"2016-02-18 14:01:04"
(当然,将其推广为任意日期时间字符串)。
让:
str = "18-Feb-2016 09:01:04"
您想要的是分两步完成的。第一种是将此字符串转换为DateTime
对象,即类DateTime
的实例。第二步是从DateTime
对象构造所需的字符串。
创建DateTime
对象的一种方法是使用方法DateTime::parse:
require 'date'
DateTime.parse(str)
#=> #<DateTime: 2016-02-18T09:01:04+00:00 ((2457437j,32464s,0n),+0s,2299161j)>
这适用于您提供的字符串格式,但对其他格式可能有问题。例如:
DateTime.parse "4-5-16 09:01:04"
#=> #<DateTime: 2004-05-16T09:01:04+00:00 ((2453142j,32464s,0n),+0s,2299161j)>
只要您知道将使用的格式,通常最好将DateTime#strptime与格式指令组成的适当模式一起使用:
pattern = "%d-%m-%y %H:%M:%S"
DateTime.strptime("4-5-16 09:01:04", pattern)
#=> #<DateTime: 2016-05-04T09:01:04+00:00((2457513j,32464s,0n),+0s,2299161j)>
有关格式指令,请参阅DateTime#strftime。
对于手头的问题:
dt = DateTime.strptime(str, "%d-%b-%Y %H:%M:%S")
#=> #<DateTime: 2016-02-18T09:01:04+00:00 ((2457437j,32464s,0n),+0s,2299161j)>
第二步是使用上面引用的strftime
方法构造所需的字符串:
dt.strftime("%Y-%m-%d %H:%M:%S")
#=> "2016-02-18 09:01:04"