Java默认的Redhat Linux Fedora中的时区问题
Java默认的RedhatLinuxFedora中的时区问题
杰夫·莫特拉姆(尖塔点商务杰夫)写的。
放在2004年12月5日,笔者在公共领域。
此文件提供“是”,没有任何明示的保证或暗示,包括但不限于为特定目的和不侵权,适销性,适用性的保证。笔者在任何情况下,是法律责任的任何索赔,损害赔偿或其他责任,无论是在合同,侵权或其他行动,产生出或在本文档或本文档中使用或其他交易。
说明
我遇到了一个与Java1.4.2的运行在Fedora的RedhatLinux(核心版本1)Java是没有检测到从操作系统的正确的默认时区的问题。它被拖欠美国/太平洋时区,即使Linux的日期命令返回正确的时区(美国/东部在我的情况)。
来测试一下你的JVM的默认时区是,编译和运行以下代码:
importjava.util.Date;
importjava.util.TimeZone;
publicclassTimeTest{
publicstaticvoidmain(Stringargs[]){
longtime=System.currentTimeMillis();
Stringmillis=Long.toString(time);
Datedate=newDate(time);
System.out.println("Currenttimeinmilliseconds="+millis+"=>"+date.toString());
System.out.println("Currenttimezone:"+TimeZone.getDefault().getID());
}
}
如果Java是使用默认时区不匹配您的系统时区(Linux的日期命令检查的方法之一),JVM没有成功检测系统时区。
Linux下的解决方案,您可以强制Java使用一个特定的时区设置TZ环境变量到一个适当的值。要设置TZ环境变量的所有实例的bash外壳,与此类似行的/etc/profile.d目录中创建一个shell脚本:
出口雅轩=“美国/东部”
[请注意:此页面上的例子都使用美国/东部时区。请代替你的时区,适当的。]
如果您的系统不支持的/etc/profile.d目录,前行添加到/etc/profile文件的初始化脚本。
在大多数版本的Linux,你可以通过检查符号链接来确定您的系统默认时区/etc/localtime的点使用的ls-l/etc/localtime的命令。响应将看起来像这样:
/etc/localtime的->的/usr/共享/zoneinfo中/美/东区
部分名称之后的/usr/share/zoneinfo中/雅轩价值。
通过启动任何shell脚本/etc/init.d下不运行/etc/profile中的代码。因此,任何Java程序启动通过的/etc/init.d中必须有一个明确的出口TZ=“美国/东部”才能正常工作。
一旦你已经设置TZ变量(您必须注销并重新登录,看到的变化),它会成为您的shell环境的一部分。要检查您已成功设置的值雅轩,在shell提示符下键入以下命令:
回声$雅轩
的替代品,
你也可以强制Java中的一个特定的默认时区,可以通过编程或使用Java系统属性。编程的另一种方法是最不具吸引力,因为它要求你改变你的Java程序加入行早在这样的程序:
TimeZone.setDefault(TimeZone.getTimeZone(美国/东“))
使用系统属性来设置默认的时区,设置中user.timezone您的时区的财产。一个地方要做到这一点就开始使用三维启动选项,这样你的Java解释器的命令行:
Java-Duser.timezone的=美国/东欧CLASS_NAME的
虽然这最后的技术工作,应当注意这个属性是不是Java规范的一部分。
JavaDefaultTimezoneIssueUnderFedoraRedhatLinux
WrittenbyGeoffMottram(geoffatminaretdotbiz).
PlacedinthepublicdomainonDecember5,2004bytheauthor.
Thisdocumentisprovided"asis",withoutwarrantyofanykind,expressorimplied,includingbutnotlimitedtothewarrantiesofmerchantability,fitnessforaparticularpurposeandnoninfringement.Innoeventshalltheauthorbeliableforanyclaim,damagesorotherliability,whetherinanactionofcontract,tortorotherwise,arisingfrom,outoforinconnectionwiththisdocumentortheuseorotherdealingsinthisdocument.
Description
IencounteredaproblemwithJava1.4.2runningunderFedoraRedhatLinux(CoreRelease1)whereJavawasnotdetectingthecorrectdefaulttimezonefromtheoperatingsystem.ItwasdefaultingtotheUS/PacifictimezoneeventhoughtheLinuxdatecommandreturnedthecorrecttimezone(US/Easterninmycase).
TotestwhatthedefaulttimezoneofyourJVMis,compileandrunthefollowingcode:
importjava.util.Date;
importjava.util.TimeZone;
publicclassTimeTest{
publicstaticvoidmain(Stringargs[]){
longtime=System.currentTimeMillis();
Stringmillis=Long.toString(time);
Datedate=newDate(time);
System.out.println("Currenttimeinmilliseconds="+millis+"=>"+date.toString());
System.out.println("Currenttimezone:"+TimeZone.getDefault().getID());
}
}
IfthedefaulttimezonethatJavaisusingdoesnotmatchyoursystemtimezone(theLinuxdatecommandisonewayofchecking),theJVMisnotsuccessfullydetectingyoursystemtimezone.
Solution
UnderLinux,youcanforceJavatouseaparticulartimezonebysettingtheTZenvironmentvariabletoanappropriatevalue.TosettheTZenvironmentvariableforallinstancesofthebashshell,createashellscriptinthe/etc/profile.ddirectorywithalinesimilartothis:
exportTZ="US/Eastern"
[Pleasenote:AlloftheexamplesonthispageusetheUS/Easterntimezone.Pleasesubstituteyourtimezone,asappropriate.]
Ifyoursystemdoesnotsupportthe/etc/profile.ddirectory,addthepreviouslinetothe/etc/profileinitializationscript.
UndermostversionsofLinux,youcandetermineyoursystemdefaulttimezonebycheckingwherethesymboliclink/etc/localtimepointstobyusingthels-l/etc/localtimecommand.Theresponsewilllooksomethinglikethis:
/etc/localtime->/usr/share/zoneinfo/US/Eastern
Theportionofthenameafter/usr/share/zoneinfo/isyourTZvalue.
Anyshellscriptsthatarestartedthrough/etc/init.ddonotrunthe/etc/profilecode.Therefore,anyJavaprogramsyoustartvia/etc/init.dmusthaveanexplicitexportTZ="US/Eastern"inordertoworkcorrectly.
OnceyouhavesettheTZvariable(youmustlogoutandlogbackintoseethechange),itwillbecomepartofyourshellenvironment.TocheckthatyouhavesuccessfullysetthevalueofTZ,typethefollowingcommandatyourshellprompt:
echo$TZ
Alternatives
YoucanalsoforcetheuseofaparticulardefaulttimezoneinJavaeitherthroughprogrammingorwithaJavasystemproperty.TheprogrammingalternativeistheleastattractiveasitrequiresthatyouchangeyourJavaprogramsbyaddingalineearlyintheprogramlikethis:
TimeZone.setDefault(TimeZone.getTimeZone("US/Eastern"))
Tosetthedefaulttimezoneusingasystemproperty,settheuser.timezonepropertytoyourtimezone.OneplacetodothisisoncommandlinethatstartsyourJavainterpreterusingthe-Dstartupoption,likethis:
java-Duser.timezone=US/EasternCLASS_NAME
Whilethislasttechniqueworks,beforewarnedthatthispropertyisnotpartoftheJavaspecification.