为什么java.util.Calendar类在android上给出了错误的日期?

时间:2014-12-03 11:47:10

标签: java android calendar timezone gregorian-calendar

我使用特定时区的格里高利历。我将日历的日期设置为1970-01-01。当我得到年,月,日字段时,它们与我设定的字段不同。

如果我在Android设备上运行此代码,则会打印" 1969-11-31"

    Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("America/Bahia_Banderas"));

    cal.clear();
    cal.set(1970, 0, 1);

    // Should print "1970-0-1" but prints "1969-11-31"
    android.util.Log.i("date", cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH));

但是,在纯Java上运行相同的代码它可以正常工作。

    Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("America/Bahia_Banderas"));
    cal.clear();
    cal.set(1970, 0, 1);

    // Prints "1970-0-1" as expected
    System.out.println(cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH));

我已经阅读了Calendar类中的bug,这似乎与我的问题有关。我尝试了错误报告中提到的解决方法,但它对我没有用。然而,最奇怪的是,同一个类在android和纯Java上的行为有所不同。我希望日历实例在我设置之后返回正确的日期。你知道如何实现这个目标吗?

4 个答案:

答案 0 :(得分:3)

Calendar.clear()在常规Java和Android中的实现方式不同。

特别是,the regular Java implementationisTimeSet设置为false。 Android implementation没有。

创建Calendar时,其时间设置为当前时间,isTimeSet设置为true。在两个实现中调用clear() unsets / zeroes字段值。

您要求的时区是UTC + 6所以1970-01-01T00:00:00在您的时区是1969-12-31T18:00:00。由于isTimeSet标记仍在Android中设置,因此在请求日期时间时不会重新计算时间。

答案 1 :(得分:0)

试试这个:

TimeZone MyTimezone = TimeZone.getDefault();
Calendar calendar = new GregorianCalendar(MyTimezone);
calendar.set(year, month, day, hour, minute, second);

String month_name=calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.getDefault());//Locale.US);
String day_name=calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault());//Locale.US);

答案 2 :(得分:0)

删除cal.clear();

我已经尝试了,它打印得正确。

好奇地

编辑。如果你这样做:

cal.clear(); 
cal.getTime();  // or any other methods that access the calendar object.
cal.set(1970, 0, 1);

它会正确打印。

我想这与.clear()

的解释有关

清除所有时间字段的值,将它们全部取消设置并将它们全部赋值为零。实际字段值将在下次访问字段时确定。

答案 3 :(得分:-1)

在android中,您可以使用这种方式获取日期: 日历日历= Calendar.getInstance(); calendar.set(1970,0,1);

的System.out.println( “年:” + calendar.get(Calendar.YEAR)+ “ - 月:” + calendar.get(的Calendar.MONTH)+ “ - 天:” + calendar.get( Calendar.DAY_OF_MONTH));

结果是:年:1970年 - 月:0 - 天:1