ProgramingTip

Java에서 TimeZone을 사용하여 절약 절약을 처리하는 방법

bestdevel 2020. 12. 29. 07:44
반응형

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();

ESTJon 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" ) ) ;

최신 및 레거시 Java의 날짜-시간 유형 표입니다.


여기에 "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

반응형