[Vm-dev] Timezones in LocalePlugin

Bert Freudenberg bert at freudenbergs.de
Thu Aug 28 11:22:32 UTC 2008


For OLPC I need a UTC time stamp, and found VM's behaviors to differ  
widely.

All VMs currently report time as local time. To identify those VMs we  
need a primitive that answers the offset of the VM time from local  
time. This could nicely fallback to 0 if no LocalePlugin is available.  
Then we also need a primitive to determine the offset of local time  
from UTC.

The locale plugin currently has three related primitives:

====================================
http://squeakvm.org/svn/squeak/trunk/platforms/Cross/plugins/LocalePlugin/LocalePlugin.h

/* return in minutes the offset between thisVM and UTC. */
sqInt	sqLocGetVMOffsetToUTC(void);

/* return in minutes the offset between the currenct timezone and UTC */
sqInt	sqLocGetTimezoneOffset(void);

/* return true if DST is in use, false otherwise */
sqInt	sqLocDaylightSavings(void);
====================================

IMHO these are insufficient, besides they do not work the same on all  
platforms. Here's what I get in Germany with DST in effect:

platform	Win	Mac	Linux
vm offset	0	0	-120
timezone	60	120	-120
daylight	true	true	true

So VMOffsetToUTC is reported as 0 by Mac and Win - I think that  
primitive is simply misnamed, which led to the wrong implementation in  
Linux. If the VM answers local time this should be 0. (we might simply  
declare the VM is always in local time and get rid of this prim  
entirely)

The TimezoneOffset should be counted EAST of Greenwich, this wasn't  
really specified in the header so that's why Linux got it wrong (Unix  
timezones are typically counted West). This *should* include DST  
adjustment IMHO as Mac and Win do. It really is the offset between  
local time and UTC.

So I propose to redefine the primitives as follows:

====================================

/* return in minutes the offset between local time and this VM.
    this value plus the time reported by the VM gives local time.
    0 indicates VM answers local time.
    If VM answers UTC, in Berlin in Summer this would be +120 */
sqInt	sqLocGetVMOffset(void);

/* return in minutes the offset between local time and UTC
    where positive values are East of Greenwich.
    e.g., Berlin in Summer is +120 in Winter +60 */
sqInt	sqLocGetUTCOffset(void);

/* return true if DST is in use, false otherwise */
sqInt	sqLocDaylightSavings(void);
====================================

As far as I am aware, nobody used these primitives yet. If renaming is  
too much hassle we could leave the old wrong names but add the  
comments as I proposed above, and adjust the behavior. Mac then would  
already be compliant, Windows is only off by an hour (in Summer?), and  
I'll fix Linux in the OLPC branch.

Comments?

- Bert -




More information about the Vm-dev mailing list