将字符串转换为 Ruby on Rails 中的日期时间格式

3
我知道这很基础,但我已经挣扎了几个小时,似乎无法应用将字符串转换为日期时间的众多方法之一,以便以这种格式2018-03-16 00:12:17.555372保存到数据库中。提前感谢您。在控制台中输出的是字符串。
params[:event][:start_date]
"03/28/2018 1:46 AM"

[编辑] 根据一些线索,我得到了一个非常糟糕的东西,也许有人可以帮助重构。我正在抑制AM或PM,因为我不知道如何解析它,我知道这很糟糕,任何帮助都将不胜感激!

  if !params[:event][:start_date].empty?
    start_date = params[:event][:start_date]
    start_date = start_date.gsub(/[AMP]/, '').squish 
    a = start_date.split('/')
    tmp = a[0]
    a[0] = a[1]
    a[1] = tmp   
    a = a.split(',').join('/')
    start_date = Time.parse(a)
  end

 if !params[:event][:end_date].empty?
   end_date = params[:event][:end_date]
   end_date = end_date.gsub(/[AMP]/, '').squish 
   a = end_date.split('/')
   tmp = a[0]
   a[0] = a[1]
   a[1] = tmp   
   a = a.split(',').join('/')
   end_date = Time.parse(a)
 end

1
params[:event][:start_date] 是从哪里来的?它是来自 HTML 表单的输入,或者可能是日期选择器吗?如果是这样,你可以考虑将其更改为传递一个符合 ISO 8601 标准的字符串。 - Stefan
这是来自表单中的 Bootstrap 日期时间选择器。我不知道如何将字符串更改为符合 ISO 8601 标准,你能在这里提供一个资源链接吗,@stefan? - David Dacruz
2个回答

11

您可以使用DateTime来解析特定格式的日期。

如果您要解析的格式是“03/28/2018 1:46 AM”,那么可以这样做。

date = DateTime.strptime('03/28/2018 1:46 AM', '%m/%d/%Y %I:%M %p')

# date to ISO 8601

puts date.to_time
# output: 2018-03-28 07:16:00 +0530

puts date.strftime("%m/%d/%Y")
# output: 03/28/2018

日期格式:

Date (Year, Month, Day):

%Y - Year with century (can be negative, 4 digits at least)
        -0001, 0000, 1995, 2009, 14292, etc.
%m - Month of the year, zero-padded (01..12)
        %_m  blank-padded ( 1..12)
        %-m  no-padded (1..12)
%d - Day of the month, zero-padded (01..31)
        %-d  no-padded (1..31)

Time (Hour, Minute, Second, Subsecond):

%H - Hour of the day, 24-hour clock, zero-padded (00..23)
%k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
%I - Hour of the day, 12-hour clock, zero-padded (01..12)
%l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
%P - Meridian indicator, lowercase (``am'' or ``pm'')
%p - Meridian indicator, uppercase (``AM'' or ``PM'')

%M - Minute of the hour (00..59)

您可以在这里参考所有格式。


完美运作,感谢@Gautam Chibde的帮助和解释。 - David Dacruz

2

在 Ruby 中,你可以这样解析:

解析给定的日期和时间表示,并创建一个 DateTime 对象。该方法不起验证器的作用。

DateTime.parse('2001-02-03T04:05:06+07:00')
                          #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
DateTime.parse('20010203T040506+0700')
                          #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
DateTime.parse('3rd Feb 2001 04:05:06 PM')
                          #=> #<DateTime: 2001-02-03T16:05:06+00:00 ...>

我不能确定您提供的字符串是否可以解析,这是有关日期时间的Ruby文档链接 Docs


我正在尝试,它有点起作用,但我觉得它是错的。我在编辑帖子,想知道是上午还是下午。谢谢@RickS。 - David Dacruz

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