1. 시간대 소개
Timezone은 시간대 오프셋을 나타내며 일광 절약 시간을 계산할 수도 있습니다.
TimeZone은 날짜, 달력 등과 같은 날짜/시간을 나타내는 개체를 작동 할 때 종종 사용됩니다. 시간대가 다르기 때문에 시간이 다르기 때문입니다.
시간대 객체를 만드는 두 가지 일반적인 방법에 대해 이야기 해 봅시다.
1. 기본 시간대 객체를 가져옵니다
사용 방법 :
TimeZone TZ = TimeZone.getDefault ()
2. gettimezone (String ID) 메소드를 사용하여 TimeZone 객체를 얻습니다.
사용 방법 :
// "gmt+08 : 00"Timezone China = Timezone.getTimezone ( "gmt+: 08 : 00")에 해당하는 시간대를 얻습니다. // "China/Chongqing"Timezone Chongqing = Timezone.gettimezone ( "Asia/Chongqing")에 해당하는 시간대를 얻습니다.
GetTimezone (String ID)에서 지원하는 모든 ID 매개 변수의 값의 경우 다음 방법으로 찾을 수 있습니다.
문자열 [] ids = timezone.getavailableIds (); for (string id : ids) system.out.printf (id+",");
출력 결과 :
etc/gmt+12 등/gmt+11, 태평양/미드웨이, 태평양/niue ... 등예를 들어, 위의 두 번째 인쇄 값 "등/gmt+11"에 해당하는 시간대를 만듭니다. 이 방법은 다음과 같습니다.
TimeZone TZ = TimeZone.getTimezone ( "etc/gmt+11"); TimeZone의 기능 인터페이스 // 생성기TimeZone () :
Object Clone () 동기화 된 정적 문자열 [] getAvailableIds () 동기화 된 정적 문자열 [] getAvailableIds (int offsetmillis) int getDStSavings () 동기화 된 정적 시간대 getDefault () 최종 문자열 getDisplayName (LOCALE LOCALE) 문자열 GETDISPLAYNAME (BOLEAN DANIGLETITE) getDisplayName () 최종 문자열 getDisplayName (부울 데이 라이트 타임, int 스타일) 문자열 getId () 초록 int getoffset (int era, int ear, int the heen, int month, int dayofweek, int timeofdaymillis) int getoffset (오랜 시간) 초록 intrawoffset () synchronized gettimezone (string id) bolean hassameres. TimeZone) 초록 부울 내일 조명 타임 (날짜 시간) 동기화 된 정적 무효 SetDefault (TimeZone Timezone) void setid (String id) 초록 void setRawoffset (int offsetmillis) 초록 부울 sodaylighttime ()
2. 시간대 예 :
다음은 날짜에 시간대를 사용하는 것을 보여주는 예입니다.
참조 코드는 다음과 같습니다 (timezonetest.java) :
import java.text.dateformat; import java.util.date; import java.util.timezone;/*** Timezone 's Test Program*/public class timezonetest {public static void main (String [] args) {// Timezone 객체 생성을위한 3 가지 방법 showusageOftimezones (); // 시간대의 다른 API를 테스트하여 testotherapis (); // GetTimezone (String ID)에서 지원하는 모든 ID를 인쇄합니다. // printAllTimezones (); } / *** 시간대 객체 생성을위한 3 가지 방법* / public static void showusageOftimezones () {TimeZone Tz; // (01) 기본 시간대 tz = timezone.getDefault (); PrintDatein (TZ); // (02) 시간대를 "gmt+08 : 00"tz = timezone.gettimezone ( "gmt+08 : 00")으로 설정합니다. PrintDatein (TZ); // (03) 시간대를 ""tz = timezone.gettimezone ( "Asia/Chongqing")으로 설정합니다. PrintDatein (TZ); }/*** tz*/private static void printDatein (TimeZone TZ)에 해당하는 날짜/시간을 인쇄 {// 날짜는 2013-09-19 14:22:30 날짜 = 새 날짜 (113, 8, 19, 14, 22, 30); // 서식에 대한 기본 dateformat을 가져옵니다 date format df = dateformat.getInstance (); // 시간대를 tz df.settimezone (tz)으로 설정합니다. // 형식으로 된 문자열을 가져옵니다. string str = df.format (date); System.out.println (tz.getId ()+":"+str); } / ** * 테스트 타임 존의 다른 API * / public static void testotherapis () {// 기본 시간대 시간대 tz = timezone.getDefault (); // "id"string id = tz.getId ()를 얻습니다. // "display name"문자열 이름 = tz.getDisplayName (); // "시간 오프셋"을 얻습니다. "1 차 자오선"에 대한 오프셋은 MS입니다. int offset = tz.getRawoffset (); // "시간 오프셋"의 해당 시간을 가져옵니다 int gmt = 오프셋/(3600*1000); System.out.printf ( "id =%s, name =%s, 오프셋 =%s (ms), gmt =%s/n", id, name, homset, gmt); } / ** * gettimezone (String id)에서 지원하는 모든 ID를 인쇄 * / public static void printalltimezones () {String [] ids = timezone.getavailableIds (); for (string id : ids) {// int offset = timezone.gettimezone (avaids [i]). getRawoffset (); //system.out.println(i+ ""+avaids [i]+""+오프셋/(3600 * 1000)+"/t"); System.out.printf (id+","); } system.out.println (); }}
3. 시간대 및 시간 교정에 대해
Java와 Solaris는 시간대에 대한 정보와 관련하여 매우 유사합니다. 각 시간대에는 시간대 ID 식별자가 있습니다. J2SE 1.3 및 1.4 에서이 ID는 문자열이며 J2SE 설치 프로그램의 JRE/LIB 서브 디렉토리에있는 이러한 ID 목록입니다. J2SE 1.3은 tzmappings 파일 만 포함하지만 J2SE 1.4에는 세계의 다른 지역에 시간대 데이터 파일이 포함되어 있습니다. JRE/LIB/ZI는 이러한 파일을 저장합니다. J2SE 1.4에서 Sun.util.calendar.zoneinfo는 이러한 파일에서 DST 규칙을 얻습니다. Solaris에서는이 시간대 데이터 파일은 이진 형식으로 저장되며 텍스트 파일이 아니므로 볼 수 없습니다. J2SE 1.4의 시간대 데이터 파일은 Solaris와는 다릅니다.
java.util.timezone 클래스의 getDefault 메소드의 소스 코드는 결국 sun.util.calendar.zoneinfo 클래스의 gettimezone 메소드를 호출 할 것임을 보여줍니다. 이 메소드는 필요한 시간 영역에 대한 문자열 매개 변수를 ID로 반환합니다. 이 기본 시간대 ID는 user.timezone (System) 속성에서 얻습니다. user.timezone이 정의되지 않으면 user.country 및 java.home (시스템) 속성으로부터 ID를 얻으려고합니다. 시간대 ID를 성공적으로 찾지 못하면 "폴백"GMT 값을 사용합니다. 즉, 시간대 ID를 계산하지 않으면 GMT를 기본 시간대로 사용합니다.
시스템 속성은 java.lang.system 클래스의 Initproperties 메소드에서 초기화됩니다. 이것은 로컬 방법입니다. 따라서 소스 코드를 사용할 수 없습니다. J2SE 배포 패키지의 로컬 코드 기반을 파헤쳐 서 공부할 경우에도 소스 코드를 사용할 수 없습니다. 그러나 Windows Systems에서는 시스템 속성이 Windows 레지스트리에서 초기화되고 Linux/Unix에서는 환경 변수로 초기화됩니다. initproperties 방법의 Javadoc 선언은 특정 속성을 "정의해야한다"고 나열해야합니다. java.util.timezone 클래스의 getDefault 메소드에서 사용하는 세 가지 시스템 속성 중 Java.home 만 Javadoc에 "보장 된"속성으로 나열됩니다.
권장 솔루션 :
그렇다면 Java가 적절한 시간과 날짜를 제공하는 방법은 무엇입니까? 가장 좋은 방법은 JVM (Java Virtual Machine)의 기본 시간대 클래스가 정확하고 지리적 범위 (로케일)에 적합하다는 것을 확인하는 것입니다. 기본 타임 존이 정확하고 적합한 지 어떻게 확인합니까? 이것은 또 다른 새로운 문제입니다. 대부분의 문제와 마찬가지로 다루는 많은 솔루션이 있습니다. java.util.timezone.getDefault 메소드의 소스 코드에 따르면 가장 좋은 방법은 user.timezone 속성을 올바르게 설정하는 것입니다. Java Virtual Machine을 시작할 때 -d 명령 줄 매개 변수를 사용하여 java.lang.system.initproperties 메소드의 값을 쉽게 무시할 수 있습니다. 예를 들어:
java -duser.timezone = Asia/Shanghai DateTest
이 명령은 DateStest 클래스를 시작하고 user.timezone 속성을 아시아/상하이로 설정합니다. java.lang.system 클래스의 SetProperty 메소드를 사용하여 user.timezone 속성을 설정할 수도 있습니다.
System.SetProperty ( "user.timezone", "Asia/Shanghai");
사용 가능한 시간대 ID가 없으면 java.util.timezon 클래스의 setDefault 메소드를 사용하여 사용자 정의 시간대를 만들어 기본 시간으로 설정할 수 있습니다. zone-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
J2SE에서 대부분의 날짜 및 시간 관련 클래스에는 java.text.dateformat과 같은 형식 클래스를 포함한 시간대 정보가 포함되어 있으므로 JVM의 기본 시간대의 영향을받습니다. 그러나 이러한 클래스의 인스턴스를 만들 때 올바른 시간대 정보를 보장하여 전체 JVM의 기본 시간대를 더 쉽게 설정할 수 있습니다. 일단 설정되면이 모든 클래스가 동일한 기본 시간대를 사용하도록 할 수 있습니다.