On Feb 24, 2010, at 3:00 PM, Adam Heath wrote:
>>
>> I'll step back first and describe briefly what the goal of time zone support
>> seems to be: let the user see all times in their own time zone regardless of
>> the server's time zone. This is complicated because when the server converts
>> a Timestamp (or java.util.Date) to a String it does so with either the
>> server's time zone (by default), or by the user's time zone if we do that
>> explicitly. When a Timestamp String comes from a user, whether it be
>> something the user entered by hand or something that is a parameter that is
>> just passed through the browser to another request (in a URL parameter or a
>> hidden form field), the server can interpret that in the user's time zone if
>> there is one, or in the server's time zone by default.
>>
>> In other words, these String representations of Timestamps passed through
>> the browser need to be interpreted consistently because they do not carry
>> time zone information with them (ie they are not like the Timestamp internal
>> representation which is a relative time from a constant point in time, in
>> the GMT time zone so there is no confusion).
>>
>> So, we have consistency problems on two sides:
>>
>> 1. producing timestamp Strings for users to, or for the browser to pass back
>> to the system in a URL parameter or hidden field
>>
>> 2. interpreting timestamp Strings in HTTP requests, from form fields or URL
>> parameters
>>
>> On both sides we have issues where changing between String value and
>> Timestamp object may be done in the server's time zone or the user's time
>> zone.
>>
>> It would be nice if all of the code that produced the Strings or consumed
>> them was consistent, but it is spread all over and not consistent.
>>
>> So, how to fix it:
>>
>> 1. more testing where the user's time zone is different from the server's,
>> and fix one problem at a time
>>
>> 2. try to introduce some sort of time zone value in timestamp String
>> representations so that we know what the time zone is instead of trying to
>> stay consistent with either the user's time zone or the server's
>>
>> 3. refactor all Timestamp code deal with #1 or #2 above to go through a
>> single spot and do the time zone compensation consistently
>>
>> I'm not sure about any of these solutions, ie none of them stand out as the
>> obvious answer. No matter what we do, we have to figure out a way to make
>> this more consistent so that code all over doesn't need to worry about it.
>> In other words, we do it in the UI layer as centrally as possible. We have a
>> problem right now though where the code is spread all over and even if we go
>> with something that automatically handles this for HTML output and HTTP
>> input then we'd have to remove time zone
>> handling everywhere else (lest the time zone compensation be done twice and
>> we end up skewed the other way).
>>
>> For now, I guess I'm going with solution #1 since that is the direction the
>> project is already moving in.
>>
>> -David
>
> The server has no time zone. It's all the user's timezone(and locale,
> really). The server should always deal with values that don't carry
> any explicit timezone/locale/color/size constraints. Those are purely
> needed for front-end representation.
The server has not time zone? Then how does it decide on the internal
representation for the following:
Timestamp.valueOf("2010-02-23 12:00:00.000");
That's just a date and time with no time zone... how does it figure out how
many milliseconds are between that date/time and the epoch time point (January
1, 1970, 00:00:00 GMT)?
I'll restate the assertion that any running JVM has a default time zone
setting. For an example check out the TimeZone.getDefault() method.
> This would mean that entity xml data has to encode the internal
> timestamp value, or a string version that includes a timezone. It
> should throw an exception if there is no timezone when converting from
> a String.
>
> Maybe introduce a new object, UserStringValue, that contains a String,
> and whatever other identifying information is required. Then, the
> conversion system could convert that to Timestamp, Date, currency, etc.
A new object won't help. The Timestamp object is just fine. The problem is in
converting to/from String representations of the date/time.
Yes, a string representation that always includes a time zone is an interesting
idea (which part of my #2 possible solution). We would still need to support
the case where we want to allow the user to manually enter a time or date/time
without explicitly saying what the time zone is, but for URL parameters and
hidden form fields that have values generated by the system this would be fine.
-David