2010-09-08 79 views
0

我有一段代码在99%的安装上运行良好,但导致HTC Desire手机上出现无限循环。Android:奇怪的GregorianCalendar行为

我想要做的是创建一个数据可用的月份列表。我从数据可用的第一个日期开始,然后使用循环,直到我到达现在。

下面是代码(简化):

GregorianCalendar today = new GregorianCalendar(); 
    GregorianCalendar xCal = new GregorianCalendar(); 
    xCal.setTime(startDate); 
    xCal.set(GregorianCalendar.DAY_OF_MONTH, resetDay); // resetDay = end of billing period 
    while(xCal.before(today)) 
    { 
     MonthObject xObj = new MonthObject(); // Create object to hold information 
     xObj.setTimestamp(xCal.getTimeInMillis()); // Save timestamp for start of period 
     xObj.setFromDate(xCal.getTime()); // Save date for start of period 
     xCal.add(GregorianCalendar.MONTH, 1); // Increment by 1 month 
     xCal.set(GregorianCalendar.DAY_OF_MONTH, resetDay); // set to end of billing period 
     xCal.set(Calendar.HOUR_OF_DAY, 0); // make sure it's midnight 
     xCal.set(Calendar.MINUTE, 0); 
     xCal.set(Calendar.SECOND, 0); 
     xCal.set(Calendar.MILLISECOND, 0); 
     xObj.setToDate(xCal.getTime()); // Save timestamp for end of period 
     xObj.setToTimestamp(xCal.getTimeInMillis()); // Save date for end of period 
    Log.v("NetworkCheck", "Added MonthObject - " + xObj.fromDate.toGMTString() + " to " + xObj.toDate.toGMTString()); 
     dates.add(xObj); // Add to collection 
     xObj = null; 
    } 
    xCal = null; 
    today = null; 

因此,在手机的99%,这给期望的结果(个月的列表)。然而,在一些手机上,我得到这个输出:

D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 
D/NetworkCheck(2311): Added MonthObject - 30 Aug 2010 22:00:00 GMT to 30 Aug 2010 22:00:00 GMT 

我绝对不知道这是为什么。有没有人遇到类似的问题?

谢谢!

安德烈亚斯

回答

0

日历CAL = Calendar.getInstance(); 日期currentLocalTime = cal.getTime(); DateFormat date = new SimpleDateFormat(“dd-MM-yyy HH:mm:ss z”); String localTime = date.format(currentLocalTime); System.out.println(localTime);

0

我知道这是一个老问题,但类似的情况发生在我的HTC手机上:当明确设置日历日期到月的第一天时,它实际上会产生更早的日期。例如,如果我这样做:date.set(2011,Calendar.MARCH,1,0,0),那么结果日期将是2月28日。我发现它连接到夏令时,似乎影响宏达电只有,因为它从来没有从其他品牌的报道,也正确地在仿真器上工作。由于我的应用在很大程度上取决于日历,我最终采用了相当丑陋的解决方法:在设置日期之后,我检查结果日期是否与预期相同,然后根据需要添加或减去小时数进行调整。