【问题标题】:Android converting calendar in one TimeZone to local TimeZoneAndroid将一个时区中的日历转换为本地时区
【发布时间】:2014-05-08 07:13:48
【问题描述】:

我正在使用以下代码将时区 (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
但我得到了结果
2014 年 12 月 5 日 13:30 1

【问题讨论】:

    标签: android datetime timezone


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多