首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android将一个TimeZone中的日历转换为本地TimeZone

Android将一个TimeZone中的日历转换为本地TimeZone
EN

Stack Overflow用户
提问于 2014-05-08 07:13:48
回答 1查看 2K关注 0票数 1

我使用以下代码将时区(GMT-3)转换为设备本地时区。

代码语言:javascript
复制
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年5月12日,下午1:30

EN

回答 1

Stack Overflow用户

发布于 2014-05-09 11:35:53

对不起,GregorianCalendar有时是地狱。你的问题如下:

如果在为年份、月份等设置字段之后立即设置时区,则此可变日历类只会移动保留已设置的包含本地时间的字段的时区。这些年份、月份等的字段将不予重新计算。这种行为也会导致cal.getTime()所代表的全球时间线发生变化。

为了强制日历对象重新计算需要调用getter的字段。注意下面的代码,特别是删除注释标记以查看效果。

代码语言:javascript
复制
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));

输出带有注释禁用行:

代码语言:javascript
复制
2014-06-12T17:00+0530
Hour=17

删除注释标记后,使用已启用行的输出:

代码语言:javascript
复制
2014-06-12T17:00-0300
Hour=17
2014-06-13T01:30+0530
Hour=1
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23535140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档