Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android将一个时区中的日历转换为本地时区_Android_Datetime_Timezone - Fatal编程技术网

Android将一个时区中的日历转换为本地时区

Android将一个时区中的日历转换为本地时区,android,datetime,timezone,Android,Datetime,Timezone,我使用以下代码将时区(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.ge

我使用以下代码将时区(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
预期结果是
时间2014年5月13日,1:30 0
但是我得到了结果

2014年5月12日13:30 1

对不起,格雷戈里安卡伦达有时是地狱。您的问题如下:

如果在设置了年、月等字段后立即设置时区,则此可变日历类将仅移动保留已设置的包含本地时间的字段的时区。年、月等字段将不会重新计算。这种行为也会导致由
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