我使用特定时区的格里高利历。我将日历的日期设置为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上的行为有所不同。我希望日历实例在我设置之后返回正确的日期。你知道如何实现这个目标吗?
答案 0 :(得分:3)
Calendar.clear()
在常规Java和Android中的实现方式不同。
特别是,the regular Java implementation将 isTimeSet
设置为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