2011-08-22 37 views
0

好的。GregorianCalendar显示奇数值?

calendar.get(Calendar.MONTH); 

返回当月的指数。例如,如果这行代码现在要执行,那么它将在8月份返回7。

然而

calendar.get(Calendar.AUGUST); 

藏汉作为

calendar.get(Calendar.MONTH); in april 

回报3?

这让我很难根据自己的开发环境获取正确的日期值。

有人能告诉我为什么这是现实吗?

回答

2

你不应该使用calendar.get(CALENDAR.AUGUST) - 这是使用常数代表就好像它是一个常数,表示一个字段类型。不幸的是,Calendar API设计得太糟糕了,国际海事组织,但你真的需要明白为什么它没有意义。

4月份的日期返回3,原因与8月份的日期返回7相同 - 在Calendar中,月份为0。我很惊讶,你是幸福的八月重返7而是由四月返回3迷茫......

无论如何,从文档的Calendar.MONTH:对于GET

场码及设置指示一个月。这是一个日历特定的值。格里高利和朱利安历法中的第一个月是JANUARY,它是0;最后一个取决于一年中的月数。

我会强烈劝你看看Joda Time如果你做任何事情,甚至稍微不平凡的在Java中使用日期和时间 - 它比Date/Calendar一个理智的和更具表现力的API。

+0

我想是时候看看第三方库。谢谢(你的)信息。 – doge

+0

@Da_smokes:我没有注意到你在Android上 - 这会让它稍微难以使用Joda Time。 (特别是,为了空间和时间的缘故,您可能希望使用一组缩减的时区。)但是,这绝对有可能。另外,内置的类可以工作,你只需要小心。 –

+0

我基本上想要做的是在任何时候都从静态时区获取yyyyMMddHH格式的日期字符串。而这些行似乎目前在做: DateTimeFormatter fmt = DateTimeFormat.forPattern(“yyyyMMddHH”); \t \t DateTime dt = new DateTime(); \t \t DateTimeZone ge = DateTimeZone.forID(“Europe/Stockholm”); \t \t fmt.withZone(ge); \t \t print(dt.toString(fmt)); – doge

1

Calendar.get()接受一个整数值,例如2来请求Month或7请求星期几。 MONTH和DAY_OF_WEEK是提供的最后整数,让您更易于指定这些值。

最后一个int AUGUST也恰好有一个值7(与DAY_OF_WEEK相同),但不打算传递给get(),它只是一个有用的int,对应于8月份返回的值(Java几个月基于零)

因此,将AUGUST传递给get()是没有意义的。这种混乱是Java枚举之前的遗留问题。如果Calendar类设计为使用枚举,它将会更清晰。

1

这与Android完全无关。 java.util.Calendar确实有一个糟糕的界面,但你也使用它错了。 calendar.get(Calendar.MONTH)返回1月= 0的当前月份,calendar.get(Calendar.AUGUST)没有意义。AUGUST的常量值恰好为7,与Calendar.DAY_OF_WEEK相同,因此您正在有效地获得星期几(星期二)。总之,不要那样做。