【问题标题】:Ruby on Rails, saving to database with proper date formatRuby on Rails,以正确的日期格式保存到数据库
【发布时间】:2017-02-24 21:30:55
【问题描述】:

我目前正在与 Rails 国际化和日期格式作斗争。

我正在开发一款应用程序,该应用程序最终将部署到美国市场以及英语和法语加拿大市场。

由于 Postgresql 数据库中的日期格式为 yyyy-mm-dd(即 2017-02-24),当我想从数据库中检索日期并将其显示在视图或表单中时,我会使用以下接近。

当显示我会使用的日期时:

<h5><%=p.date.strftime("%m/%d/%Y - %l:%M:%S %p")%></h5> 

在表单中处理它们时,我会在控制器中检索日期,然后执行:

@receivable.date_posted = Date.today.strftime("%m/%d/%Y")

然后它会在表格中使用正确的格式显示。 在表单中,我有一个日期选择器,可以选择正确的 m/d/yyyy 格式的日期。

然后,一旦提交表单,我必须从 params(m/d/yyyy)格式中获取日期,并将其重新格式化为正确的数据库日期格式 yyyy-mm-dd,如下所示:

@receivable.date_posted = Date.strptime(params[:date_posted],"%m/%d/%Y")

我很快意识到,一旦我尝试实现加拿大日期格式,这会有点疯狂,所以我研究了国际化。

我已经为市场创建了正确的语言环境,现在当我想显示正确的日期格式时使用以下内容

但是,我仍然对在表单中处理日期时该怎么做感到困惑。

现在我在检索记录时不必格式化日期,我在表单中使用以下内容。

<%= f.text_field :date_posted, :value => (l f.object.date_posted, format: :notime), class: "form-control input-sm text-center",id: "receivable_date_posted", style: "display: inline-block; vertical-align: middle; width: 60%; margin: 0 5px 0 0;"%>

但是当我尝试在适当的控制器事件中更新或创建记录时,这并不能解决我的问题,因为日期仍然来自 m/d/yyyy 格式的参数(或其他格式,具体取决于语言环境) .

有没有一种简单的方法可以将日期保存为适当的数据库格式,而无需转换日期(这可能意味着根据区域设置为每种可能的日期格式转换日期?)

【问题讨论】:

  • 您的日期选择器能否显示一种格式但在表单中存储另一种格式?这样,您可以在任何地方使用 ISO8601 格式 (YYYY-MM-DD),除了在应用的最边缘。

标签: ruby-on-rails date internationalization date-formatting


【解决方案1】:

假设 PostgreSQL 为您提供其日期格式,即:“2017-02-24” 您的目标是将其格式化为打印:“24/02/2017” 试试这个

postgres_date = "2017-02-24"

date_goal = Date.parse(postgres_date).strftime("%m-%d-%Y").gsub('-', '/')

输出 =>“2017 年 2 月 24 日”

date_goal = Date.parse(postgres_date).strftime("%m-%d-%Y  %l:%M:%S %p").gsub('-', '/')

输出 => "02/24/2017 12:00:00 AM"

反过来,假设您有一个日期mm/dd/YYYY,例如:“04/27/2017”,您可以这样做:

actual_date_format = "02/24/2017"
date_goal = actual_date_format.split('/').reverse.join('-')

输出 => 2017-24-02`

然后

Date.strptime(date_goal, '%Y/%d/%m')

希望对您有所帮助。

【讨论】:

  • 感谢您的回答。我实际上是在尝试在不使用此类转换的情况下找到解决方案。如果我只使用一种日期格式(mm/dd/yyyy),这很有效,但是当我们部署到加拿大时,在某些省份使用 yyyy/mm/dd 或 dd/mm/yyyy,我将不得不复制这些转换和帐户对于每种可能的日期格式。它最终看起来像这样: case current_user.locale when 'CAN-EN' #Do some date conversion here when 'CAN-FR' #Do another date conversion here when 'US-EN' #Do another date conversion end
猜你喜欢
  • 2012-07-22
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2011-01-14
  • 1970-01-01
相关资源
最近更新 更多