SimpleDateFormat 및 시간대를 사용하는 중에 이상한 문제가 발생합니다. 나는 로스 앤젤레스 시간대 (GMT-8) 전화 시간대가 변경되면 SimpleDateFormat setTimeZone이 작동하지 않습니다.
- :
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.parse
및 setTimeZone
을 사용하여 1970 년부터 초 단위로한다 저장 시간대를 적절히 이동하려면 시간대를 사용하십시오.
그러나 휴대 전화의 표준 시간대 변경이 SimpleDateFormat에 반영되지 않은 것 같지만 TimeZone.getDefault().getID()
에는 변경 사항이 명확하게 반영되어있는 것처럼 보입니다.
이 문제를 해결할 방법이 있습니까?
관찰 된 것은 예상되는 동작입니다. JVM에는 자체 표준 시간대 설정이 있으며 장치 표준 시간대 설정과 다를 수 있습니다. 설정하기 위해 아무 것도하지 않으면 JVM이 시작될 때 장치 설정으로 초기화됩니다. 그 후에는 자동으로 변경되지 않지만 Joda-Time (이미이 라이브러리를 사용할 때)을 통해 변경하는 한 가지 방법 (좋은 방법)이 있습니다. –