Обсуждение: timestamp issues

Поиск
Список
Период
Сортировка

timestamp issues

От
Charl Gerber
Дата:
I have a machine physically located in the USA, but
the OS (Linux) time is set to New Zealand time. So if
I execute "date" on the command prompt, I get the New
Zealand time.

I have java classes converting all time to timezone
"Europe/Amsterdam".

I have tables with "TIMESTAMP" fields (no timezone).

If I do this (through a JDBC call):

"UPDATE users SET last_login=current_timestamp"

then the database explorer shows the times in New
Zealand time, as expected. But my the Java classes see
the time (after converting the time to the Amsterdam
timezone) as 19 hours ahead of Amsterdam time. (19
hours is, I think, the difference between the USA and
New Zealand times?). I also tried with LOCALTIMESTAMP
instead of current_timestamp, same result.

If, however, I change the update to this:

"UPDATE users SET last_login=?"
with
prepareStatement.setTimestamp(1, new Timestamp(
    System.currentTimeMillis());

Then the java classes see the time correct as it
should.

Why is this? Why does System.currentTimeMillis() and
current_time give different times?


Re: timestamp issues

От
Oliver Jowett
Дата:
Charl Gerber wrote:

> I have tables with "TIMESTAMP" fields (no timezone).
>
> If I do this (through a JDBC call):
>
> "UPDATE users SET last_login=current_timestamp"
>
> then the database explorer shows the times in New
> Zealand time, as expected. But my the Java classes see
> the time (after converting the time to the Amsterdam
> timezone) as 19 hours ahead of Amsterdam time. (19
> hours is, I think, the difference between the USA and
> New Zealand times?). I also tried with LOCALTIMESTAMP
> instead of current_timestamp, same result.

When you use getTimestamp() on a timestamp-without-timezone column, the
JDBC driver treats it as a timestamp in the (Java client's) default
timezone, a US timezone in your case I believe.

In theory you can pass an appropriate Calendar object to getTimestamp()
to tell the driver to treat it as a timestamp in that timezone if no
timezone information is associated with the timestamp column. The code
looks a bit hairy though, I'd be interested to know if this actually works.

-O