Android 将一个 TimeZone 中的日历转换为本地 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.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

最佳答案

对不起,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

关于Android 将一个 TimeZone 中的日历转换为本地 TimeZone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23535140/

相关文章:

java - 将日期列表转换为日期范围字符串

python - 如何使用 dateparser 从字符串中提取实际日期?

mysql - Rails 以 GMT 存储日期时间,但会转换为本地时间

android - 在 FragmentTab 中使用额外 Intent 时出错

Android 布局和图像按钮和灰色边框

android - 如何在一个 ConstraintLayout 中对多个 View 进行分组

MySQL 时间戳到 Excel 日期/时间

android - 在函数内部时,jQuery 更改事件不会在移动设备上触发

python - 为什么pytz好像没有任何时区信息?

ruby-on-rails - 在 Rails 中,如何将时间转换并打印到不同的时区?