Sådan bruger du Java Timezone ID i et Windows-program (ikke-Java)?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal tilføje tidszoneoplysninger til en db-tabel med brugervedligeholdte steder. Dataene vil få adgang til det meste fra Java-kode, men der er også nogle PL/SQL- og Win32 (Delphi) -koder, som skal forstå tidszoneinformationen.


Det ser lige frem til at bruge id'et fra java.util.TimeZone. Java kan nemt konvertere det (selvfølgelig), Hibernate har indbygget support til det og tilsyneladende også Oracle forstår disse tidszoner ids:


select TZ\_OFFSET('Pacific/Marquesas') from dual.


Problemet er: tidszone-id'er synes ikke at være kompatible med Windows Timezone DB. For eksempel er java.util.timezone id 'Pacific/Marquesas' (-09: 30) ikke i tidszone-pickliste i Windows. Registreringsdatabasen indeholder det slet ikke; se


SOFTWAREMicrosoftWindows NTCurrentVersionTime Zones


Her kan jeg kun vælge enten -09: 00 eller -10: 00. Så hvis jeg skulle gemme tidszonen som dette, hvordan kan jeg komme til den faktiske offset/DST infos i Windows (uden Java)? Forhåbentlig kræver det ikke et kortlægningsbord, som jeg skal holde ajour med, når det ændres. Er der en globalt accepteret standard, der fungerer bedre end java timezone id?


Opdater


Tidszonen info bruges i kombination med DATE kolonner i databasen. Disse kolonner indeholder lokale dato/tid værdier. Hvis en placering kan associeres med disse værdier, muliggør lokaliseringens tidszone mig om at konvertere dato/klokkeslæt til UTC eller en anden tidszone, når det er nødvendigt.


Jeg er klar over, at i stedet for DATE ville en TIMESTAMP\_TZ datatype eller noget lignende være mere passende. Dette ville imidlertid kræve en data-migrering (for hvilken TZ er påkrævet igen) og understøttes ikke af de gamle programmer, der også arbejder på dataene (medmindre en masse kode ændres). Problemet er næsten det samme, hvis jeg skulle konvertere værdierne til UTC.


Nederste linje er jeg nødt til at holde DATO værdierne i lokal tid, men jeg har brug for at vide for nogle af dem som TZ det betyder.

Bedste reference


Jeg kan give lidt baggrund, hvis ikke et rigtigt svar.


Mange systemer bruger Olson implementering af tidszone data. Så disse navne arbejder i mange systemer (mest Unix, Java, Oracle jeg tror). Microsoft gør deres egne ting. [3]


Jeg ser nederst på det Wikipedia link der er en reference til nogle kortlægning til Windows verden.


Held og lykke!

Andre referencer 1


Jeg er klar over, at dette ikke er den bedste måde at gøre det på, men det kan være tilstrækkeligt i dit tilfælde. Uden at kende alle de krav, jeg ikke kan fortælle.


Hvad skal du bruge tidszoneoplysninger til? Bare for at præsentere tiden med den korrekte forskydning og måske også navnet på tidszonen?


Du kan fortsætte med at bruge Java til at bestemme, hvad offset for brugeren er, ved at kigge op i brugerens valgte tidszone ved hjælp af Java. Hver gang brugeren logger ind i posten i din database, hvad modregningen er i øjeblikket. Så kan andre apps se på Disse oplysninger for at bestemme, hvordan du formaterer tiden.


Dette forudsætter, at brugere, der regelmæssigt logger ind, er dem, som dette skal gøres for. Hvis det ikke er tilfældet, kan du køre et dagligt job for at opsøge tidszonen for hver bruger i Java og optage den forskydning, der aktuelt er i kraft.


Hackish er enig, men den eneste anden måde jeg ser er at opretholde en kortlægning. Og hvad sker der, når nogen vælger en tidszone, som du ikke har en kortlægning til?