15

(私の問題は、この質問で説明されているものとほとんど同じですが、私の場合、その答えだけが機能しません。)


Postgres db を使用して Rails アプリでjQuery UI Datepickerを使用しています。デフォルトの実装では、mm/dd/yy日付形式を使用して、選択した日付を表示します。これはまさに私が望むものです。ただし、レコードをデータベースに保存すると、月と日が逆になり、yy-dd-mmとして表示されます。したがって、2012 年 3 月 11 日を選択すると、3 月 11 日ではなく 11 月 3 日として保存され、2012 年 3 月 31 日などの日付は存在しないため、まったく保存されません。

これを修正しようとして、これまでに3つの異なる道をたどりました:

1)最初の試みは、テキストフィールドを再フォーマットして、表示が希望どおりに見えるようにすることでした:

<%= f.text_field :foo, :value => (@model.foo.blank? ? '' : @model.foo.strftime('%m/%d/%Y')), class: "datepicker" %>

これにより、最初は 03/31/2012 が正しく表示されていましたが、保存すると逆になりました。

2)次に、日付が保存されるデフォルトの方法を変更してみました。これで問題が回避されると考えました。この質問への回答で説明したように、 config/locales/en.ymlに次を追加しました。

# config/locales/en.yml
en:
  date:
    formats:
      default: "%m/%d/%Y"

これはまったく違いはありませんでした。次に、この質問を見つけて、次の行でconfig/initializers/date_formats.rbを作成しようとしました。

Date::DATE_FORMATS[:default]="%m/%d/%Y"
Time::DATE_FORMATS[:default]="%m/%d/%Y %H:%M"

上と同じで、違いはありません。

3) たくさんの組み合わせを試してみた結果、DID が機能することがわかったのは、datepicker プラグインへの呼び出しで yyyy-mm-dd 形式を指定することでした。これは私が望んでいたものとは逆ですが、少なくとも日付は正常に保存されました。したがって、datepicker 呼び出しは次のようになります。

$( ".datepicker" ).datepicker({ dateFormat: 'yy-mm-dd' });

カレンダーから 3 月 31 日を選択すると、フィールドに 2012-03-31 が入力され、保存後も 2012-03-31 として表示されます。

しかし、どうすれば日付ピッカーを mm/dd/yy 形式で動作させることができますか? それが難しいことだとは想像できませんが、何が欠けているのでしょうか? 日付が Postgres に保存される方法を変更する必要はありますか? (日時ではなく、日付として指定されます。)

4

3 に答える 3

3

データベースにデータを保存する方法によって異なります。RAW sql クエリを使用する場合はto_date('31 Mar 2012', 'DD Mon YYYY')、挿入クエリで使用できます。

Postgres のto_date リファレンス

さて、クライアント側では、jquery 日付ピッカーで使用できます

$.datepicker.formatDate('dd-M-yy', Yourdate);

DD Mon YYYYの方が分かりやすいので使いました。mm/dd/yy必要に応じて、形式またはその他の形式を使用できます。そのような場合、 postgre の関数で必要な形式を使用しますto_date

上記のコードはテストしていません。問題がある場合や問題が発生した場合は、コメントを残してください。

編集:

Date.parse('2011-06-18')データをデータベースに挿入し、日付ピッカーに設定する前に、RailsビューでformatDate使用できます 'yy-mm-dd'

于 2012-04-05T21:37:42.183 に答える
0

データベース クラスタのデフォルトの日付形式をグローバルに変更する場合は、 DateStyle GUCを設定してpostgresql.confリロードすることもできます。

datestyle = 'iso, mdy'

(とにかくこれがデフォルトであるべきです。)

これは、アプリでの日付の表示方法には影響しないことに注意してください。PostgreSQL があいまいな入力と Postgres のいくつかの出力オプションを解釈する方法。


(明らかに)別の接続datestyleで psqlの設定を確認しても、何も証明されません。あなたのアプリは、ローカル設定に関連して別の設定をしている可能性があります。(psqlからではなく)実際の接続内の設定を確認する必要があります。datestyle

datestyle 設定が'iso, mdy'の場合、希望どおりに機能するはずです。日付リテラルはmonth-before-dayと解釈されます。このデモを検討してください (PostgreSQL 9.1 を使用):

db=# set datestyle = 'ISO, MDY ';
設定
db=# select '1.12.2012'::date;
    日にち
------------
 2012-01-12
(1行)

db=# set datestyle = 'ISO, DMY ';
設定
db=# select '1.12.2012'::date;
    日にち
------------
 2012-12-01
(1行)

鉱山を強調します。

アプリによって実際に設定されているオプションを確認するには、設定できます

log_statement = all

あなたpostgresql.confとリロード。次に、アプリを起動して日付を保存します。すべてのコマンドがログに記録されます。後でリセットしてリロードすることを忘れないでください (そうしないと、ログ ファイルが巨大になる可能性があります)。

log_statement = none

次に、アプリが実際にデータベースに送信したものを db ログ ファイルで確認します。


to_date()また、任意の形式で日付リテラルを入力できるコマンドにも興味があるかもしれません。しかし、それは必要ないはずです。

于 2012-04-06T00:09:30.600 に答える
0

元のポスターと同じ問題に遭遇しました。日付/時刻を相互に比較する必要があるため、後で追加のコードと変換が必要になるため、DB フィールドを文字列に変更したくありませんでした。

モデルで before_save と attr_accessor を次のように使用することになりました。

before_save    :format_date
attr_accessor  :unformatted_date

def format_date
  self.inquiry_date = Date.strptime(self.unformatted_date, "%m/%d/%Y").to_time(:utc)
end

私のビューの行は次のようになります。

f.text_field  :unformatted_date, :value => (@foo.inquiry_date.blank? ? '' : @foo.inquiry_date.strftime('%m/%d/%Y)), :id => 'datepicker'
于 2012-06-01T15:27:08.623 に答える