1

Ich kämpfe derzeit mit Rails Internationalisierung und Datumsformate.Ruby on Rails, Speichern in der Datenbank mit dem richtigen Datumsformat

Ich arbeite an einer App, die schließlich für den U.S. Markt sowie Englisch und Französisch Canadian Märkte eingesetzt werden wird.

Mit dem Datumsformat JJJJ-MM-TT (dh 2017-02-24) in der Postgresql-Datenbank, wenn ich ein Datum aus der Datenbank abrufen und es in einer Ansicht oder einem Formular anzeigen wollte, würde ich das verwenden folgender Ansatz

Wenn die Anzeige des Datums würde ich verwenden:

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

Wenn sie in Formen der Handhabung, würde ich das Datum in der Steuerung abrufen und dann tun:

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

Und dann würde es zeigen, mit das richtige Format im Formular. Im Formular habe ich einen Datepicker, der das Datum im richtigen Format m/d/yyyy auswählt.

Und dann, sobald das Formular eingereicht wurde, musste ich das Datum aus dem Format params (welches in m/d/jjjj war) und formatieren es in das richtige Datenbank-Datumsformat yyyy-mm-dd wie folgt:

Ich erkannte schnell, dass dies ein bisschen verrückt wäre, sobald ich versuche, die kanadischen Datumsformate zu implementieren, also habe ich in Internationalisierung geschaut.

Ich habe die richtigen Schauplätze für die Märkte geschaffen und nun die folgenden Befehle verwenden, wenn ich das richtige Datumsformat

jedoch angezeigt werden soll, habe ich mich immer noch verwirrt finden, was Daten in Formen zu tun, beim Umgang mit .

Jetzt muss ich das Datum beim Abrufen des Datensatzes nicht formatieren, und ich verwende Folgendes im Formular.

<%= 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;"%> 

Aber das ist nicht mein Problem zu lösen, wenn ich zu aktualisieren versuchen, oder die Aufzeichnung in dem richtigen Controller-Event zu erstellen, weil das Datum noch von dem params in dem m/d/yyyy Format kommt (oder ein anderes Format abhängig auf dem Gebietsschema).

Gibt es eine einfache Möglichkeit, ein Datum in dem richtigen Datenbank-Format zu speichern, ohne das Datum zu konvertieren, die (was möglicherweise bedeutet das Datum für jedes mögliche Datumsformat konvertieren, auf der je nach der Region?)

+1

Kann Ihr Datumswähler ein Format anzeigen, aber ein anderes im Formular speichern? Auf diese Weise können Sie mit ISO8601-Formaten (YYYY-MM-DD) überall arbeiten, außer an den Rändern Ihrer App. –

Antwort

0

Unter der Annahme, PostgreSQL Sie sein Datumsformat i.e: "2017.02.24" und Ihr Ziel ist es, um Druck zu formatieren: "24/02/2017" versuchen, diesen

postgres_date = "2017-02-24" 

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

output => "2017.02.24"

oder

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

output => "2017.02.24 00.00.00"

Und der umgekehrte Weg, Sie unter der Annahme haben ein Datum mm/dd/YYYY wie: "2017.04.27" Sie tun können:

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

output => 2017-24-02`

dann

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

Hoffe, es half.

+0

Danke für die Antwort. Ich versuche tatsächlich, eine Lösung zu finden, ohne solche Konvertierungen zu verwenden. Das funktioniert gut, wenn ich nur ein Datumsformat verwende (MM/TT/JJJJ), aber wenn wir in einigen Provinzen in Kanada JJJJ/MM/TT oder TT/MM/JJJJ bereitstellen, müsste ich diese Konvertierungen und mein Konto replizieren für jedes mögliche Datumsformat. Es wäre die Suche nach etwas am Ende wie folgt: Fall current_user.locale wenn ‚CAN-DE‘ #Do einige Datumsumstellung hier wenn ‚CAN-FR‘ #Do ein anderes Datum Umwandlung hier wenn ‚US-DE ' # Eine weitere Datumsumwandlung Ende – Dan