2014-05-08 35 views
1

我正在使用以下代碼將時區(GMT-3)轉換爲設備本地時區。Android將一個TimeZone中的日曆轉換爲本地TimeZone

int hour=17,minute=0,day=12,month=6,year=2014; 

Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT-3")); 
cal.set(year, (month-1), day,hour,minute); 

cal.setTimeZone(TimeZone.getDefault()); 
Log.d("Time", cal.get(Calendar.DATE)+"/"+cal.get(Calendar.MONTH)+"/"+cal.get(Calendar.YEAR)+" , "+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+" "+cal.get(Calendar.AM_PM)); 

我的本地時區爲GMT + 5:30
預期結果爲:
時間13/5/2014,下午1:30 0
但我得到的結果
2014年12月5日, 13:30 1

回答

2

對不起,GregorianCalendar有時是地獄。您的問題如下:

如果您在設置年份,月份等字段後立即設置時區,則此可變日曆類將只移動保留已包含當地時間的已設置字段的時區。不會重新計算年份,月份等字段。此行爲也會導致由cal.getTime()表示的全局時間軸上的偏移。

爲了強制日曆對象重新計算您需要調用getter的字段。注意以下代碼,特別是刪除註釋標記以查看效果。

int hour = 17, minute = 0, day = 12, month = 6, year = 2014; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ"); 
TimeZone tz1 = TimeZone.getTimeZone("GMT-3"); 
sdf.setTimeZone(tz1); 

Calendar cal = new GregorianCalendar(tz1); 
cal.set(year, (month - 1), day, hour, minute); 
//  System.out.println(sdf.format(cal.getTime())); 
//  System.out.println("Hour=" + cal.get(Calendar.HOUR_OF_DAY)); 

TimeZone tz2 = TimeZone.getTimeZone("GMT+0530"); 
sdf.setTimeZone(tz2); 
cal.setTimeZone(tz2); 
System.out.println(sdf.format(cal.getTime())); 
System.out.println("Hour=" + cal.get(Calendar.HOUR_OF_DAY)); 

輸出與註釋停用的線:

2014-06-12T17:00+0530 
Hour=17 

輸出與使能的線路已經除去註釋標記後:

2014-06-12T17:00-0300 
Hour=17 
2014-06-13T01:30+0530 
Hour=1