Java에서 TimeZone을 사용하여 절약 절약을 처리하는 방법
Java 애플리케이션에서 EST 시간을 인쇄해야합니다. 다음을 사용하여 존재를 EST로 설정했습니다.
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
그러나 이것이 바로 내 코드가 올바른 시간을 인쇄하지 않습니다.
일광 절약 시간이 준수 여부에 관계없이 코드가 항상 정확한 시간을 읽도록 만드는 방법은 무엇입니까?
추신 : 주장을 EDT로 설정했지만 해결되지 않았습니다.
시작해야 할 문제는 다음과 가변적입니다.
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
3 글자 약어는 TZDB 영역 ID를 위해 전적으로 피해야합니다. EST는 동부 표준 시간-과 표준 시간을 표준 시간 DST 관찰; 실제로 전체 존재 이름이 아닙니다. 의 시간대 일부 에 사용되는 이름 입니다. (불행히도이 "반 성적"개념에 대한 좋은 용어를 찾지.)
은 원하는 당신 전체 시간대 이름을. 예를 들어 다음 America/New_York
은 동부 표준시입니다.
TimeZone zone = TimeZone.getTimeZone("America/New_York");
DateFormat format = DateFormat.getDateTimeInstance();
format.setTimeZone(zone);
System.out.println(format.format(new Date()));
다른 답변, 특히 Jon Skeet의 답변은 하지만 구식입니다.
java.time
이러한 오래된 날짜 - 시간 클래스는 자바 8 이상에 내장 된 java.time -frame 워크 로 대체되었습니다 .
현재 시간을 UTC로 표시 비용 Instant
클래스를 사용하십시오 .
Instant now = Instant.now();
EST
Jon Skeet 의 올바른 답변에 설명 된대로 제공가 아닙니다 . 3-4 자 코드는 표준화 고유하지 DST (일광 절약 시간제)에 대한 혼란을 더욱 심화합니다. "대륙 / 지역"형식의 고유 한 이름을 사용하십시오.
북미 동부 해안의 동부 표준시를 의미했을 것입니다. 아니면 이집트 표준시? 아니면 유럽 표준시?
ZoneId zoneId = ZoneId.of( "America/New_York" );
ZoneId zoneId = ZoneId.of( "Africa/Cairo" );
ZoneId zoneId = ZoneId.of( "Europe/Lisbon" );
이러한 ZoneId
개체를 사용 하여 현재 순간을 특정 시간대로 조정하여 개체 를 생성 합니다.ZonedDateTime
ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;
첫 번째에서 다른 ZonedDateTime 개체를 생성하여 해당 ZonedDateTime을 다른 대상으로 조정합니다. java.time 프레임 워크는 기존 객체를 변경 (변형)하는 대신 변경 불가능한 객체를 사용 합니다.
ZonedDateTime zdtGuam = zdt.withZoneSameInstant( ZoneId.of( "Pacific/Guam" ) ) ;
여기에 "EST"를 입력하는 대신 "EST5EDT"를 입력 할 수 있습니다. "EDT"만 작동하지 않습니다. 이것은 일광 절약 시간 문제를 설명합니다. 코드 라인은 다음과 달라집니다.
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST5EDT"));
이 답변에 따라 :
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
public static float calculateTimeZone(String deviceTimeZone) {
float ONE_HOUR_MILLIS = 60 * 60 * 1000;
// Current timezone and date
TimeZone timeZone = TimeZone.getTimeZone(deviceTimeZone);
Date nowDate = new Date();
float offsetFromUtc = timeZone.getOffset(nowDate.getTime()) / ONE_HOUR_MILLIS;
// Daylight Saving time
if (timeZone.useDaylightTime()) {
// DST is used
// I'm saving this is preferences for later use
// save the offset value to use it later
float dstOffset = timeZone.getDSTSavings() / ONE_HOUR_MILLIS;
// DstOffsetValue = dstOffset
// I'm saving this is preferences for later use
// save that now we are in DST mode
if (timeZone.inDaylightTime(nowDate)) {
Log.e(Utility.class.getName(), "in Daylight Time");
return -(ONE_HOUR_MILLIS * dstOffset);
} else {
Log.e(Utility.class.getName(), "not in Daylight Time");
return 0;
}
} else
return 0;
}
private static Long DateTimeNowTicks(){
long TICKS_AT_EPOCH = 621355968000000000L;
TimeZone timeZone = Calendar.getInstance().getTimeZone();
int offs = timeZone.getRawOffset();
if (timeZone.inDaylightTime(new Date()))
offs += 60 * 60 * 1000;
return (System.currentTimeMillis() + offs) * 10000 + TICKS_AT_EPOCH;
}
Java에서 DateFormatter는 기본적으로 DST를 사용합니다. 일광 절약 (DST)을 피하기 위해 수동으로 트릭을 수행해야합니다.
먼저 DST 오프셋을 가져와야합니다. 즉, 적용된 밀리 초 DST 수, 예를 들어 DST도 45 분 동안입니다. 일부 지역에서는 30 분
이지만 대부분의 경우 DST는 1 시간입니다.
Timezone 객체를 사용하고 DST에 해당하는지 여부를 날짜로 확인한 다음 수동으로 DST 오프셋을 추가해야합니다. 예 :
TimeZone tz = TimeZone.getTimeZone("EST");
boolean isDST = tz.inDaylightTime(yourDateObj);
if(isDST){
int sec= tz.getDSTSavings()/1000;// for no. of seconds
Calendar cal= Calendar.getInstance();
cal.setTime(yourDateObj);
cal.add(Calendar.Seconds,sec);
System.out.println(cal.getTime());// your Date with DST neglected
}
TimeZone 클래스를 구현하여 시간대를 캘린더로 설정하면 일광 절약 시간이 처리됩니다.
java.util.TimeZone은 시간대 오프셋을 나타내며 일광 절약 시간도 계산합니다.
샘플 코드 :
TimeZone est_timeZone = TimeZoneIDProvider.getTimeZoneID(TimeZoneID.US_EASTERN).getTimeZone();
Calendar enteredCalendar = Calendar.getInstance();
enteredCalendar.setTimeZone(est_timeZone);
참조 URL : https://stackoverflow.com/questions/10545960/how-to-tackle-daylight-savings-using-timezone-in-java
'ProgramingTip' 카테고리의 다른 글
header ()를 사용하여 PHP로 강제 파일 다운로드 (0) | 2020.12.29 |
---|---|
GCD에서 "전역 면역"과 "주 면역"의 차이점은 무엇입니까? (0) | 2020.12.29 |
쉼표와 세미콜론을 사용하고 있습니까? (0) | 2020.12.29 |
람다 함수의 조건문? (0) | 2020.12.29 |
Django Rest Framework의 Serializer 클래스에 추가 인수 전달 (0) | 2020.12.29 |