Comments?
We are using these primitives. Let me check with Brad if your observations ring a bell (he did most of that work).
Cheers, - Andreas
Bert Freudenberg wrote:
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/Lo...
/* 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 -