3

日時値として送信するテキスト フィールドに文字列を挿入する js カレンダーを使用しています。問題があるかどうかはわかりませんが、今のところ SQLite を使用しています。

次のようにフォーマットを設定しています(イニシャライザで):

Time::DATE_FORMATS[:default] = '%m/%d/%Y %H:%M'
Time::DATE_FORMATS[:db] = '%m/%d/%Y %H:%M'

Rails が別の形式を使用して日付を検証しているように見えるため、これは機能しません。

たとえば、次のように設定した場合:

myobject.my_datetime = '06/30/2012 00:00'

最終的に null になります (ActiveRecord によって生成された SQL クエリ自体がそれを NULL に設定します)。12 以下の日に設定すると、日付の部分は正しくなります (ただし、生成された SQL クエリには、月の前日を含む文字列が表示されます。つまり、上記の例では、SQL クエリの文字列は '30 です) /06/2012 05:00:000000')。

ご覧のとおり、config.time_zone を東部時間に設定しているにもかかわらず、UTC(?) に 5 時間を追加しているようです。

動作は、コンソールからでもフォーム送信でも同じです。

私が欠けているものについて何か提案はありますか?

アップデート:

jdoeの提案に従ってこれを行うと:

myobject.my_datetime = Time.strptime('06/30/2012 08:00', '%m/%d/%Y %H:%M')

生成されたクエリは正しく表示されるようになりました (4 時間の差は無視されます)。

UPDATE "myjoin_table" SET "my_datetime" = '06/30/2012 04:00.000000' .....

そのようにしてデータベースに取り込まれます。

しかし、オブジェクトをリロードすると、AR オブジェクトの値は nil に初期化されます。

コントローラー アクションで文字列を 1 つずつ解析し、パラメーターを手動で update_attributes に設定するだけだと思います。これは必要以上に難しいです。

4

1 に答える 1

7

ActiveRecord は日付/時刻を UTC+00:00 で保存します。+5 ゾーンに住んでいる場合、ActiveRecord は割り当て時に 5 時間を自動的に差し引きます。したがって、現在のタイムゾーンは、現地時間に何時間を加算/減算する必要があるかを示しています.

パースについて。次のことを試しましたか?

myobject.my_datetime = Time.strptime('06/30/2012 00:00', '%m/%d/%Y %H:%M')

Rails の時刻/日付の設定は、割り当てではなく、表示のために行われます。ユーザーから文字列を取得して、日付/時刻属性に割り当てることは、素晴らしいアイデアではありません。割り当てでは、文字列ではなく適切な時間オブジェクトを使用することをお勧めします。ユーザーがハッカーになろうとしている場合、このstrptimeメソッドは を発生させます。ArgumentErrorあなたrecord.date_time='string'は静かに失敗します。


UPD: 使用例

p = Product.first
p.last_visited = Time.strptime('06/30/2012 00:00', '%m/%d/%Y %H:%M')
p.save # leads to UPDATE "products" SET "last_visited" = '2012-06-29 21:00:00.000000'
Product.last_visited.localtime.strftime('%m/%d/%Y %H:%M') # => "06/30/2012 00:00"

ご覧のとおり、時間は問題なく保存および取得されます。

UPD 2: I18n

を見つけますconfig/locales/en.yml。以下を追加します。

en:
  time:
    formats:
      default: '%m/%d/%Y %H:%M'

t使用時間(またはtranslate) ヘルパーを解析するには:

@time = Time.strptime('06/30/2012 00:00', t('time.formats.default'))

l(または) ヘルパーを使用localizeして、時間を形式で表示します。

= l @time
于 2012-06-05T10:59:17.267 に答える