安卓日历返回错误的月份编号

3
我正在编写一个函数,用于比较一些sqlite存储日期的周数和当前日期的周数。但是Calendar类的set(y, m, d)方法总是返回一个错误的月份,例如在我的情况下,它返回一个月份设置为七月而不是六月的日期。以下是我的代码片段:
//Date depuis SQLite/Grab date from SQLite
String[] tokens = extraireTokensDate(s.getDateHeure());

//Comparaison semaine/Week compare
Calendar cal1 = Calendar.getInstance();
Date date = new Date();
cal1.setTime(date);

Log.d("DEBUG", "DATE SQL : "+Integer.parseInt(tokens[0])+" "+Integer.parseInt(tokens[1])+" "+Integer.parseInt(tokens[2]));
Calendar cal2 = Calendar.getInstance();
cal2.set(Integer.parseInt(tokens[0]), Integer.parseInt(tokens[1]), Integer.parseInt(tokens[2]));

SimpleDateFormat sdf = new SimpleDateFormat("W) dd/MM/yyyy");

Log.d("DEBUG", "(Actuel/Now) DATE : "+sdf.format(cal1.getTime()));
Log.d("DEBUG", "(Actuel/Now) Numero de semaine (annee/year) : "+cal1.get(Calendar.WEEK_OF_YEAR));    
Log.d("DEBUG", "(Passe/Past) DATE : "+sdf.format(cal2.getTime()));
Log.d("DEBUG", "(Passe/Past) Numero de semaine (annee/year) : "+cal2.get(Calendar.WEEK_OF_YEAR));

调试器的输出(日期以法语格式显示)
06-12 19:32:37.035: DEBUG/DEBUG(5777): DATE SQL : 2011 6 12
06-12 19:32:37.045: DEBUG/DEBUG(5777): (Actuel/Now) DATE : 3) 12/06/2011
06-12 19:32:37.045: DEBUG/DEBUG(5777): (Actuel/Now) Numero de semaine/Week number (annee/year) : 24
06-12 19:32:37.055: DEBUG/DEBUG(5777): (Passe/Past) DATE : 3) 12/07/2011
06-12 19:32:37.055: DEBUG/DEBUG(5777): (Passe/Past) Numero de semaine/Week number (annee/year) : 28
06-12 19:32:37.065: DEBUG/DEBUG(5777): DATE SQL : 2011 6 11
06-12 19:32:37.075: DEBUG/DEBUG(5777): (Actuel/Now) DATE : 3) 12/06/2011
06-12 19:32:37.075: DEBUG/DEBUG(5777): (Actuel/Now) Numero de semaine/Week number (annee/year) : 24
06-12 19:32:37.075: DEBUG/DEBUG(5777): (Passe/Past) DATE : 3) 11/07/2011
06-12 19:32:37.075: DEBUG/DEBUG(5777): (Passe/Past) Numero de semaine/Week number (annee/year) : 28
06-12 19:32:37.095: DEBUG/DEBUG(5777): DATE SQL : 2011 6 7
06-12 19:32:37.105: DEBUG/DEBUG(5777): (Actuel/Now) DATE : 3) 12/06/2011
06-12 19:32:37.105: DEBUG/DEBUG(5777): (Actuel/Now) Numero de semaine/Week number (annee/year) : 24
06-12 19:32:37.105: DEBUG/DEBUG(5777): (Passe/Past) DATE : 2) 07/07/2011
06-12 19:32:37.105: DEBUG/DEBUG(5777): (Passe/Past) Numero de semaine/Week number (annee/year) : 27
06-12 19:32:37.125: DEBUG/DEBUG(5777): DATE SQL : 2011 6 3
06-12 19:32:37.125: DEBUG/DEBUG(5777): (Actuel/Now) DATE : 3) 12/06/2011
06-12 19:32:37.125: DEBUG/DEBUG(5777): (Actuel/Now) Numero de semaine/Week number (annee/year) : 24
06-12 19:32:37.135: DEBUG/DEBUG(5777): (Passe/Past) DATE : 2) 03/07/2011
06-12 19:32:37.135: DEBUG/DEBUG(5777): (Passe/Past) Numero de semaine/Week number (annee/year) : 27

有没有想法我做错了什么?
3个回答

10

这是因为set()方法中使用的月份数字是从零开始计数的(例如,JANUARY = 0),而您传递的是正常的月份数字(即一月 = 1)。

我建议使用提供的SimpleDateFormat.parse()方法。


基于0的月份日期 - 天才/直觉/合理! - RunLoop

2

在Java中,月份是从0开始计数的(特别是与日期相关的类)。

这里是Calendar::set的API文档:

设置日历字段YEAR, MONTH和DAY_OF_MONTH的值。其他日历字段的先前值将保留。如果不需要此功能,请首先调用clear()。 参数: year->用于设置YEAR日历字段的值。

month ->用于设置MONTH日历字段的值。月份值从0开始计数,例如,1月为0。

date ->用于设置DAY_OF_MONTH日历字段的值。


谢谢,你在哪里找到这个参考资料的?我查看了Android参考文档(http://developer.android.com/reference/java/util/Calendar.html#set%28int,%20int,%20int%29),但是没有找到答案。 - DoesNotCompute

0

你有检查过 Integer.parseInt(tokens[1]) 的实际值吗?从你的代码看似乎没有问题,请检查一下你从 SQLite 数据库获取到的数值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接