我正在使用以下代码将时区(GMT-3)转换为设备本地时区。
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 但我得到的结果是 12/5 / 2014,13:30 1
答案 0 :(得分:3)
对不起你,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