2016-06-19 5 views
2

시간대를 fullname 시간대를 사용하여 다른 시간대로 변환하려고합니다. 아래는 자바 API입니다.FullName 시간대가 잘못된 시간입니다.

TimeZone.setDefault(TimeZone.getTimeZone("Africa/Algiers")); 
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 
    String dateInString = "09:44:00"; 
    TimeZone tzGMT01 = TimeZone.getTimeZone("Africa/Algiers"); 
    formatter.setTimeZone(tzGMT01); 

    Date dateInAmerica = formatter.parse(dateInString); 
    String fromInput = formatter.format(dateInAmerica); 
    TimeZone tzGMT03 = TimeZone.getTimeZone("Asia/Bahrain"); 
    formatter.setTimeZone(tzGMT03); 

    String toInput = formatter.format(dateInAmerica); 
    Time ts = java.sql.Time.valueOf(toInput); 

09:44:00의 시간 가치에 대한 예상 출력은 "아시아/바레인"시간이 11:44:00에 있습니다 변환. 그러나 출력은 13:44:00입니다.

위의 진술에서 잘못된 점을 안내 해줄 수 있습니까? SimpleDateForma 제대로 트릭을 할 것입니다

SimpleDateFormat f = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 

Date currentTime = new Date(); 
System.out.println(f.format(currentTime.getTime())); 

f.setTimeZone(TimeZone.getTimeZone("Asia/Bahrain")); 
System.out.println(f.format(currentTime.getTime())); 

: 당신은 아시아/바레인에 제공되는 시간대를 사용

답변

2

귀하의 문제가 자바 Date 전체 날짜 값뿐만 아니라 시간 값이다 :

여기 내 출력됩니다. 년/월/일 값을주지 않으면 기본값은 1970/01/01입니다.

세계는 다시 1970 Algiers에서 달랐다 UTC + 0 시간대를 사용하였으며, Bahrain는 알제은 UTC + 1 개 시간대를 사용하는 오늘날 달리 UTC + 4를 사용하고, 바레인은 UTC + 3을 사용하고 있습니다.

날짜를 무시하면 일광 절약 시간제가있는 시간대에 문제가 발생할 수도 있습니다.

보시는 것처럼 입니다.

09:44:00       Africa/Algiers 
1970-01-01 09:44:00 CET (+0000) Africa/Algiers 
1970-01-01 13:44:00 AST (+0400) Asia/Bahrain 

2016-01-01 09:44:00    Africa/Algiers 
2016-01-01 09:44:00 CET (+0100) Africa/Algiers 
2016-01-01 11:44:00 AST (+0300) Asia/Bahrain 

시간대 이름 CETAST 실제로 알제이 GMT를 사용하던 1970 년에 대한 잘못된

TimeZone tzAlgiers = TimeZone.getTimeZone("Africa/Algiers"); 
TimeZone tzBahrain = TimeZone.getTimeZone("Asia/Bahrain"); 

SimpleDateFormat fmtTimeAlgiers = new SimpleDateFormat("HH:mm:ss"); 
fmtTimeAlgiers.setTimeZone(tzAlgiers); 

SimpleDateFormat fmtDatetimeAlgiers = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
fmtDatetimeAlgiers.setTimeZone(tzAlgiers); 

SimpleDateFormat fmtFullAlgiers = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z (Z)"); 
fmtFullAlgiers.setTimeZone(tzAlgiers); 

SimpleDateFormat fmtFullBahrain = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z (Z)"); 
fmtFullBahrain.setTimeZone(tzBahrain); 

Date date1970 = fmtTimeAlgiers.parse("09:44:00"); 
System.out.println(fmtTimeAlgiers.format(date1970) + "       " + tzAlgiers.getID()); 
System.out.println(fmtFullAlgiers.format(date1970) + " " + tzAlgiers.getID()); 
System.out.println(fmtFullBahrain.format(date1970) + " " + tzBahrain.getID()); 
System.out.println(); 

Date date2016 = fmtDatetimeAlgiers.parse("2016-01-01 09:44:00"); 
System.out.println(fmtDatetimeAlgiers.format(date2016) + "    " + tzAlgiers.getID()); 
System.out.println(fmtFullAlgiers.format(date2016) + " " + tzAlgiers.getID()); 
System.out.println(fmtFullBahrain.format(date2016) + " " + tzBahrain.getID()); 
System.out.println(); 

출력, 바레인은 GST를 사용했다 : 여기

는 코드를 보여주는 것입니다 (걸프 표준시).

+0

그 답변의 끝 부분에서 언급했듯이,'CET','AST','GST'와 같은 3 - 4 자의 약어가 문제입니다. 표준 시간대가 아니며 표준화되지 않았고 고유하지 않습니다 (!). 대신 [적절한 시간대 이름] (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)을 사용하십시오. –

+0

이것은 올바른 분석입니다. 나는 입력 된 시간을 현재 날짜로 변환하고 입력 된 시간을 덧붙였다. 이 날짜 시간 값이 올바른 변환 값을 반환했습니다. 이것은 매우 도움이됩니다. 고맙습니다. – Anjana

0

이 제대로 작동해야 I just did an example here.

> 06/18/2016 23:55:13 
> 06/19/2016 05:55:13 
+0

왜 OP 코드가 작동하지 않는지 설명하지 않았습니다. – Andreas

관련 문제