Android日历返回错误的月份编号

时间:2011-06-12 17:59:10

标签: java android calendar

我正在开发一个函数来比较一些sqlite存储日期的周数和当前日期的周数。

但是Calendar类的set(y,m,d)方法总是返回一个月号错误的日期,在我的例子中,它返回一个日期,其中月份设置为7月而不是6月。

这是我的代码片段:

//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 个答案:

答案 0 :(得分:10)

这是因为set()方法所采用的月份数是零索引的(例如JANUARY = 0),但是你传递的是正常月份数(即1月= 1)。

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

答案 1 :(得分:2)

基于java的月份是0(特别是与日期相关的类)

以下是Calendar::set

的api文档

设置日历字段YEAR, MONTH, and DAY_OF_MONTH的值。保留其他日历字段的先前值。如果不需要,请先致电clear()。 参数: 年 - >用于设置YEAR日历字段的值。

月 - >用于设置MONTH日历字段的值。月值基于0。例如,0表示1月。

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

答案 2 :(得分:0)

您是否检查过Integer.parseInt(令牌[1])的实际值?您的代码似乎没有任何问题,请检查您从sqlite db获取的值?