Fusul orar Java este greșit

Am o aplicație Tomcat și trebuie să afișez câteva valori de timp. Din păcate, timpul se apropie de o oră. M-am uitat în ea și am descoperit că TimeZone-ul meu implicit este setat la:

sun.util.calendar.ZoneInfo[id="GMT-08:00",
                           offset=-28800000,
                           dstSavings=0,
                           useDaylight=false,
                           transitions=0,
                           lastRule=null]

Mai degrabă decât fusul orar din Pacific. Acest lucru este indicat în continuare când încerc să tipăresc fusul orar implicit numele afișat și apare "GMT-08: 00", ceea ce pare să-mi arate că nu este setat corect în fusul orar din SUA. Eu rulez pe Ubuntu Hardy Heron, modernizat de Gutsy Gibbon.

Există un fișier de configurare pe care îl pot actualiza pentru a spune JRE să utilizeze Pacificul cu toate informațiile asociate timpului de economisire a timpului de vară? Timpul de pe aparatul meu arată corect, deci nu pare să fie o configurație greșită la nivel de sistem.


Bine, iată o actualizare. Un coleg a sugerat să actualizez JAVA_OPTS în / etc / profile pentru a include "-Duser.timezone = US / Pacific", care a funcționat (am văzut și CATALINA_OPTS, pe care l-am actualizat și eu). De fapt, tocmai am exportat schimbarea în variabile, mai degrabă decât să folosesc noul / etc / profile (un reboot mai târziu va prelua modificările și voi fi de aur).

Totuși, cred că există o soluție mai bună ... ar trebui să existe o configurație pentru Java undeva, care să spună ce zonă de fus se folosește sau cum se apucă de fusul orar. Dacă cineva știe un astfel de cadru, ar fi minunat, dar deocamdată este o soluție decentă.


Eu folosesc 1,5, și este cel mai sigur o problemă DST. După cum puteți vedea, fusul orar este setat să nu utilizeze economia de vară. Credința mea este că este setat generic la -8 offset decât zona specifică de Pacific. Deoarece offset-ul generic -8 nu are informații despre economia de vară, este evident că nu îl folosiți, dar întrebarea este, unde să-i spun lui Java să folosească fusul orar din Pacific atunci când pornește? Nu caut o solutie programatica, ar trebui sa fie o solutie de configurare.

0
fr hi bn

4 răspunsuri

Este posibil să vă ajutați să verificați din nou normele de fus orar pe care le utilizează sistemul dvs. de operare.

/usr/bin/zdump -v /etc/localtime | less

Acest fișier ar trebui să conțină regulile dvs. privind economia de vară, ca acesta pentru anul 2080:

/etc/localtime  Sun Mar 31 01:00:00 2080 UTC = Sun Mar 31 02:00:00 2080 BST isdst=1 gmtoff=3600

Puteți compara acest lucru cu regulile fusului orar pe care credeți că ar trebui să le utilizați. Ele pot fi găsite în / usr / share / zoneinfo / .

0
adăugat

Este un "quirk" în modul în care JVM caută fișierul zoneinfo. Consultați ID-ul de eroare 6456628 .

Cea mai ușoară soluție este de a face / etc / localtime un symlink la fișierul zoneinfo corect. Pentru ora Pacific, următoarele comenzi ar trebui să funcționeze:

# sudo cp /etc/localtime /etc/localtime.dist
# sudo ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime

Nu am avut probleme cu abordarea simbolică.

Editați: Adăugat "sudo" la comenzi.

0
adăugat
+1: Tocmai am intrat într-un server Ubuntu 9.10 complet actualizat. Sun JDK 1.6.0_15-b03, Sistemul este configurat la ora de instalare pentru fusul orar din SUA / Est. / etc / localtime conține conținutul identic al / usr / share / zoneinfo / US / Eastern. Java produce rezultate incorecte pentru datele cuprinse între 15 martie 2010 și 25 aprilie. După înlocuirea fișierului cu un symlink la / usr / share / zoneinfo / US / Eastern, acum obțin rezultate corecte. Sunt surprins că acest bug este a) încă deschis, b) afectează un server Ubuntu complet actualizat (9.10 - Karmic).
adăugat autor Mark Renouf, sursa
Buga este notată ca fiind închisă în Java versiunea 7 (b72).
adăugat autor Raedwald, sursa
Schimbarea / etc / localtime la un symlink; s-ar putea să vă așteptați să spargeți lucrurile în sistemele Linux mai moderne (de exemplu, atunci când pachetele sunt actualizate sau, eventual, la pornire - bănuiesc că motivul pentru schimbarea de la un symlink la o copie a unui fișier ar trebui să aibă legătură cu secvențierea pornire și dependențe mai ales dacă / usr / se află pe un sistem de fișiere diferit). Consider că este mai util să setați variabila de mediu TZ.
adăugat autor Cameron Kerr, sursa

Am avut o problemă similară, probabil aceeași. Cu toate acestea, serverul meu de tomcat rulează pe o casetă de ferestre, astfel încât soluția symlink nu va funcționa.

Am setat -Duser.timezone = Australia / Sydney în JAVA_OPTS , însă Tomcat nu ar recunoaște că DST era în vigoare. Ca soluție, am schimbat codul Australia / Sydney (GMT + 10: 00) la Pacific / Numea (GMT + 11: 00) să cunoască soluția sau eroarea actuală, dacă este cazul.

0
adăugat

Pe Ubuntu, nu este suficient să schimbăm doar fișierul / etc / localtime. Se pare că se citește și fișierul / etc / timezone. Este mai bine să urmați instrucțiunile pentru a seta fusul orar corect. În special, efectuați următoarele:

$ sudo cp /etc/timezone /etc/timezone.dist
$ echo "Australia/Adelaide" | sudo tee /etc/timezone
Australia/Adelaide
$ sudo dpkg-reconfigure --frontend noninteractive tzdata

Current default time zone: 'Australia/Adelaide'
Local time is now:      Sat May  8 21:19:24 CST 2010.
Universal Time is now:  Sat May  8 11:49:24 UTC 2010.

În Ubuntu, dacă / etc / localtime și / etc / timezone sunt inconsistente, Java pare să citească fusul orar implicit din / etc / timezone.

0
adăugat
Funcționează ca un farmec pe Ubuntu 10.0.4 LTS. Destul de frumos. Am purtat pur și simplu sudo dpkg-reconfigura tzdata și am putut selecta fusul orar corect în interfață.
adăugat autor msung, sursa
Doar am intrat în această problemă în lubuntu 16.04 (gnome). Această soluție a funcționat ca un farmec.
adăugat autor 7yl4r, sursa
dpkg-reconfigurarea tzdata a fost exact ceea ce căutam. Mulțumiri!
adăugat autor Dinesh Reddy Parne, sursa