Date formats

Just realized I have a nice problem.

using Postgresql...

When I save something via Rails to the table it's saved with a GMT offset (so 12:00 becomes 16:00) But the database is configured to save everything as GMT.

Which means -- when I query it via SQL it's coming back as now + 4 hours instead of just plain now.

Where/How do I get this back in sync?

Just realized I have a nice problem.

using Postgresql...

When I save something via Rails to the table it's saved with a GMT offset (so 12:00 becomes 16:00) But the database is configured to save everything as GMT.

Which means -- when I query it via SQL it's coming back as now + 4 hours instead of just plain now.

Where/How do I get this back in sync?

Directly via SQL... you can't since that's what the values are. However, through AR you can...

Not sure if it's moved in 3.1, but in 3.0, the following is in config/application.rb

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.     # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.     config.time_zone = 'Pacific Time (US & Canada)'

OK, so the default time saved is UTF-8. Which means that storing it a what appears to be now+4 hours is correct. I think my question falls into a postgresql question. When I query these fields it appears as the time (16:00 instead of 12:00) is identified as "timestamp with time zone" -- unexpected. I don't think I quite understand what it is I am looking at...

Which means that it is offset by postgres to/from the time zone of the client making the query, your rails app in this case. Timestamp without time zone makes no adjustments, just storing/retrieving it as supplied.

In SQL Standard you set a client timezone using SET TIME ZONE, which PostgreSQL supports.

Timezone can be set using the "timezone" configuration parameter, which can be set in the file postgresql.conf, or in any of the other standard ways described, such as set for each session using SET. There are also some special ways to set it:

    * The SQL command SET TIME ZONE sets the time zone for the session.

    * The PGTZ environment variable is used by libpq clients to send a SET TIME ZONE command to the server upon connection.

So you can set this on the client or the server, for the user, explicitly and other ways.

Thank you very much. I had a feeling it was a postgres thing and not a rails thing. I'm impressed at what rails/ruby can do about timezone just the same.

Personally, I find working with date/time to be the most problematic data type *ever*!

UTC for everything, always. Localize the time in rails on the front- end, but always store and compare in UTC on the back-end. Trust me, it will make your life a lot easier.