2017-12-09 1 views
0

에 기본적으로하지 않습니다 나는 다음과 같은 코드를 가지고있다. 자바 날짜 시간의 문자열 형식은 gmt + 0입니다. 따라서 나중에 다른 지역의 시간대에 따라 변환해야하지만 기본 시간대를 설정하려고하면 그것은 나에게 2017년 12월 9일 09:00 보여주는 내 컴퓨터가 그리니치 표준시 + 8. 출력에 원인이 다시 또 다른 8 시간 계속 : 00하지만 GMT + 0이기 때문에 2017-12-09 17:00:00으로 유지하고 싶습니다.자바 세트 시간대는 GMT + 0

String existingTime = "2017-12-09 17:00:00"; 
    String newTime = "2017-12-09 14:00:00"; 

    Date existingDateTime = null; 
    Date newDateTime = null; 
    Date localexistingDateTime = null; 
    Date localnewDateTime = null; 
    DateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    TimeZone tz = TimeZone.getDefault(); 
    sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
    // sdf.setTimeZone(TimeZone.getTimeZone("GMT+8:30")); 

    try { 
     existingDateTime = dateTimeFormat.parse(existingTime); 
     newDateTime = dateTimeFormat.parse(newTime); 

     System.out.println("GMT existingDateTime" + sdf.format(existingDateTime)); 
     System.out.println("GMT newDateTime" + sdf.format(newDateTime)); 
    } catch (ParseException ex) { 
     System.out.println("MyError:Parse Error has been caught for date parse close"); 
     ex.printStackTrace(System.out); 
    } 
+2

. 대신에 유즈 케이스에 적합한 적절한 클래스를'java.time' 패키지에서 찾아야한다. –

+0

@ JoeC 그래서이 문제를 극복하기위한 당신의 제안은 무엇입니까? – user8012596

+2

나의 제안은'java.util.Date' 사용을 중지하고 대신'java.time' 패키지의 클래스를 사용하는 것입니다. –

답변

2

이 스 니펫을 사용하면 최신 Java 날짜 및 시간 API 인 java.time을 사용할 수 있습니다. Java Specification Request 이후 JSR-310으로도 알려져 있습니다. 이것은 내가 (유럽/베를린 타임 존) 내 컴퓨터에있어 출력했다

UTC existingDateTime: 2017-12-09 17:00:00 
Pyongyang existingDateTime: 2017-12-10 01:30:00 
Singapore existingDateTime: 2017-12-10 01:00:00 

하지만 독립적 현대 클래스를 유지하기 쉽다 :

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"); 
    String existingTime = "2017-12-09 17:00:00"; 
    OffsetDateTime existingDateTime = LocalDateTime.parse(existingTime, formatter) 
      .atOffset(ZoneOffset.UTC); 
    System.out.println("UTC existingDateTime: " + existingDateTime.format(formatter)); 
    System.out.println("Pyongyang existingDateTime: " 
      + existingDateTime.atZoneSameInstant(ZoneId.of("Asia/Pyongyang")) 
        .format(formatter)); 
    System.out.println("Singapore existingDateTime: " 
      + existingDateTime.atZoneSameInstant(ZoneId.of("Asia/Singapore")) 
        .format(formatter)); 

스 니펫을 실행의 출력은 JVM의 표준 시간대이므로 컴퓨터에서 동일한 출력을 얻어야합니다.

EDIT : 시간대 대신 GMT + 09 : 00 오프셋을 사용할 수없는 경우 의견을 물었습니다. 당신이 원하는 것 내가 왜 확실 해요 그 실제 사람들이 시간대보다는 오프셋에 살고 있지만, 방법을 알고 때 쉽게 이후 :

System.out.println("GMT+09:00 existingDateTime: " 
      + existingDateTime.withOffsetSameInstant(ZoneOffset.ofHours(9)) 
        .format(formatter)); 

출력은 :

GMT+09:00 existingDateTime: 2017-12-10 02:00:00 

LocalDateTime입니다 시간대 또는 오프셋 정보가없는 날짜와 시간. 문자열에 오프셋 또는 영역이 없으므로 구문 분석에이 문자열을 사용합니다. 그리고 당신은 당신의 date-time이 GMT + 0에 있다고 말했기 때문에 오프셋 된 UTC와 함께 OffsetDateTime으로 변환합니다. 거기에서 다른 현지 시간대로 변환하는 것이 간단합니다. 그래서 시간대의 몇, 나는 당신을 수집하기 때문에, 내가 구문 분석에 사용 된 것과 같은 포맷을 사용하여 날짜 - 시간을 포맷 할 때마다이 yyyy-MM-dd HH:mm:ss 형식을 좋아하는 경향이 있음을 보여줍니다.

나는 항상 지역/도시 형식으로 시간대를 제공합니다. 이것은 분명하지 않습니다 (예 : PYT는 파라과이 시간 또는 평양 시간을 의미 할 수 있습니다). 또한 시간대가이를 사용하는 경우 여름 시간 (DST)을 자동으로 처리합니다. 존 오프셋의 역사적인 변화조차도 내장되어 있습니다.

java.time을 사용하려면 Oracle Tutorial on Date Time을 참조하고 스택 오버플로 관련 질문을 검색하십시오. 항상 java.time 답변을 찾으십시오 (오래된 클래스를 사용하여 많은 오래된 답변을 건너 뛰고 건너 뛰십시오.). 그물에있는 더 많은 장소는 귀중한 자원을 보유합니다. 귀하의 검색 엔진과 가난한자를 구별하는 능력은 친구입니다.

좀 더 강력하게 기존`java.util.Date`, 이유이되는 하나를 사용하여 무리를 줄 수 없습니다
+0

vv 스 니펫에 감사드립니다. 방법에 대해 예를 들면. gmt + 09 : 00 대신 zoneid를 대체 할 수 있습니까? – user8012596

+0

물론 가능합니다. 내 편집을 참조하십시오. @ user8012596 –

+1

감사합니다. 그 이유는 내 DB에서 GMT-05 : 00과 -05 : 00로 둘 다 보관했기 때문입니다. 따라서 ZoneOffset.ofHours (9)를 사용하면 가장 좋은 점은 무엇입니까? 내가 ZoneOffset.ofHours (-05 : 00)로 사용할 수 있습니까? – user8012596

관련 문제