2017-12-23 9 views
1

SimpleDateFormat 및 시간대를 사용하는 중에 이상한 문제가 발생합니다. 나는 로스 앤젤레스 시간대 (GMT-8) 전화 시간대가 변경되면 SimpleDateFormat setTimeZone이 작동하지 않습니다.

  • I와 입력 날짜가

    • :

      String input    = "2017-12-21 16:15:00"; 
          String inputTZ   = "America/Los_Angeles"; 
          String phoneTZ   = TimeZone.getDefault().getID(); 
          SimpleDateFormat fmtInput = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
          fmtInput.setTimeZone(TimeZone.getTimeZone(inputTZ)); 
      
          SimpleDateFormat fmtOutputEventTZ = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
          fmtOutputEventTZ.setTimeZone(TimeZone.getTimeZone(inputTZ)); 
      
          SimpleDateFormat fmtOutputPhoneTZ = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
          fmtOutputPhoneTZ.setTimeZone(TimeZone.getTimeZone(phoneTZ)); 
      
      
          try { 
           LocalDateTime dt = new LocalDateTime(fmtInput.parse(input)); 
      
           Log.d("DEBUG>>>>", "INPUT=" + input); 
           Log.d("DEBUG>>>>", "TZ_EVENT=" + inputTZ); 
           Log.d("DEBUG>>>>", "TZ_PHONE=" + phoneTZ); 
           Log.d("DEBUG>>>>", "DT=" + dt); 
           Log.d("DEBUG>>>>", "OUTPUT_EVENT=" + fmtOutputEventTZ.format(dt.toDate())); 
           Log.d("DEBUG>>>>", "OUTPUT_PHONE=" + fmtOutputPhoneTZ.format(dt.toDate())); 
          } 
          catch (Exception e) { 
           e.printStackTrace(); 
          } 
      

      코드 논리는 다음과 같다 :

      는 기본적으로, 나는이 코드를 가지고 시간대 (LA)를 지정하여이 날짜를 구문 분석하십시오.

    • 그런 다음 원래 시간대 (LA)와 현재 전화 시간대를 사용하여 날짜 형식을 지정하십시오.

    시카고 (GMT-6)로 설정된 내 전화 시간대로 코드를 실행하고 다음 출력을 받았습니다.

    D/DEBUG>>>>: INPUT=2017-12-21 16:15:00 
    D/DEBUG>>>>: TZ_EVENT=America/Los_Angeles 
    D/DEBUG>>>>: TZ_PHONE=America/Chicago 
    D/DEBUG>>>>: DT=2017-12-21T18:15:00.000 
    D/DEBUG>>>>: OUTPUT_EVENT=2017-12-21 16:15:00 
    D/DEBUG>>>>: OUTPUT_PHONE=2017-12-21 18:15:00 
    

    기본적으로 예상 한 결과입니다. 나는 응용 프로그램을 다시 시작하지 않고 뉴욕 (GMT-5)의 일 내 전화 시간대를 변경하는 경우

    그러나, 나는 TimeZone.getDefault().getID()에 의해 반환되는 시간대가 올바른 것을

    D/DEBUG>>>>: INPUT=2017-12-21 16:15:00 
    D/DEBUG>>>>: TZ_EVENT=America/Los_Angeles 
    D/DEBUG>>>>: TZ_PHONE=America/New_York 
    D/DEBUG>>>>: DT=2017-12-21T18:15:00.000 
    D/DEBUG>>>>: OUTPUT_EVENT=2017-12-21 15:15:00 
    D/DEBUG>>>>: OUTPUT_PHONE=2017-12-21 18:15:00 
    

    주의 다음과 같은 결과를 얻었다 하나,하지만 구문 분석 할 때 SimpleDateFormat은 전화 시간대가 시카고 인 것처럼 변환하여 잘못된 시간을 반환합니다. 나는 응용 프로그램을 죽이고 다시 시작하는 경우

    그러나, 동일한 코드가 잘 작동 : 나의 이해에서

    D/DEBUG>>>>: INPUT=2017-12-21 16:15:00 
    D/DEBUG>>>>: TZ_EVENT=America/Los_Angeles 
    D/DEBUG>>>>: TZ_PHONE=America/New_York 
    D/DEBUG>>>>: DT=2017-12-21T19:15:00.000 
    D/DEBUG>>>>: OUTPUT_EVENT=2017-12-21 16:15:00 
    D/DEBUG>>>>: OUTPUT_PHONE=2017-12-21 19:15:00 
    

    , 날짜를 구문 분석 SimpleDateFormat.parsesetTimeZone을 사용하여 1970 년부터 초 단위로한다 저장 시간대를 적절히 이동하려면 시간대를 사용하십시오.

    그러나 휴대 전화의 표준 시간대 변경이 SimpleDateFormat에 반영되지 않은 것 같지만 TimeZone.getDefault().getID()에는 변경 사항이 명확하게 반영되어있는 것처럼 보입니다.

    이 문제를 해결할 방법이 있습니까?

  • 답변

    2

    해결책을 찾았습니다!

    저는 처음에 DateTimeZone.setDefault(DateTimeZone.forID(TimeZone.getDefault().getID()))을 호출했습니다.

    응용 프로그램이 시작될 때 DateTimeZone.setDefault이 호출되었지만 사용자의 시간대가 변경되었을지라도 이후에 joda-time 자체로 재설정되지 않았을 것으로 생각됩니다.

    +1

    관찰 된 것은 예상되는 동작입니다. JVM에는 자체 표준 시간대 설정이 있으며 장치 표준 시간대 설정과 다를 수 있습니다. 설정하기 위해 아무 것도하지 않으면 JVM이 시작될 때 장치 설정으로 초기화됩니다. 그 후에는 자동으로 변경되지 않지만 Joda-Time (이미이 라이브러리를 사용할 때)을 통해 변경하는 한 가지 방법 (좋은 방법)이 있습니다. –

    관련 문제