Android timezone bug真的很奇怪

时间:2016-10-19 09:59:14

标签: java android

任何人都可以告诉我这里的代码会给出不同的结果吗?

    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(1477785600000l);
    cal.add(Calendar.DAY_OF_MONTH, 1);
    System.out.println(cal.getTime());
    System.out.println(cal.getTimeInMillis());


    Calendar cal1 = Calendar.getInstance();
    cal1.setTimeInMillis(1477785600000l);
    cal1.add(Calendar.HOUR, 24);
    System.out.println(cal1.getTime());
    System.out.println(cal1.getTimeInMillis());

它在服务器端运行良好,但在Android平台上运行时会产生不同的结果。

4 个答案:

答案 0 :(得分:1)

您应该使用Calendar.HOUR_OF_DAY代替Calendar.HOUR。 像这样:

cal1.add(Calendar.HOUR_OF_DAY, 23);

答案 1 :(得分:0)

您是否使用相同的日历实例来比较结果的相等性?

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(1477785600000l);
//add 1 day to the date
cal.add(Calendar.DAY_OF_MONTH, 1);
Log.e("first time", "" + cal.getTime());
Log.e("second time", "" + cal.getTimeInMillis());
//reset the calendar to the instance value removing the day added before
cal.add(Calendar.DAY_OF_MONTH, -1); //or you can use cal.setTimeInMillis(1477785600000l);
//add 24 hours to the base calendar value
cal.add(Calendar.HOUR, 24);
Log.e("third time", "" + cal.getTime());
Log.e("fourth time", "" + cal.getTimeInMillis());

我在Android Monitor输出中获得相同的值

E/first time: Mon Oct 31 02:00:00 CET 2016
E/second time: 1477875600000
E/third time: Mon Oct 31 02:00:00 CET 2016
E/fourth time: 1477875600000

答案 2 :(得分:0)

只是托马斯评论的副本。 这是正确的答案,谢谢大家

  

请记住,1天不一定等于24小时,即涉及夏令时。作为一个例子(不正确,只是为了说明这一点)如果我在10月31日2:00添加1天,我希望在2月1日2:00,但如果我添加24小时并且dst切换发生在那个时候我可以在3月3日(或左右)获得。 - 我的意思是,如果你在“day”字段中添加1,则小时不会更改,但如果在“小时”字段中添加24,则可以计算当天(翻转),其中可能包括dst。

答案 3 :(得分:-1)

请查看Cal.add()方法。在第一个实例中,您添加月份,在第二个实例中,您添加小时。改变它们,它会正常工作。

请参阅文档链接:https://developer.android.com/reference/java/util/Calendar.html#getDisplayNames(int,int,java.util.Locale)

您需要使用HOUR_OF_DAY 24小时格式。小时是用于12小时制(0 - 11)。中午和午夜由0表示,而不是12表示。例如,在10:04:15.250 PM,HOUR是10而不是22。