所以我正在开发一个日历程序并更改月份,我要求输入月份的整数。
如果我输入calendar.get(Calendar.JANUARY),我会得到1作为返回值,这是正确的,因为第一个月。但如果我输入 calendar.get(Calendar.FEBUARY) 我会得到 2018 的响应,这当然是错误的。有谁知道问题出在哪里吗?
Calendar cal1 = new GregorianCalendar();
int month = cal1.get(Calendar.JANUARY);
int month2 = cal1.get(Calendar.FEBRUARY);
int year = cal1.get(Calendar.YEAR);
最佳答案
java.time
T.J. Crowder’s answer是正确的。请允许我为您的问题提供真实、良好且现代的解决方案。
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Atlantic/Stanley"));
// 2018-05-21T05:02:23.942763-03:00[Atlantic/Stanley]
Month monthEnum = zdt.getMonth(); // MAY
int monthNumber = zdt.getMonthValue(); // 5
int year = zdt.getYear(); // 2018
我刚才运行了代码,并在每行代码后面的注释中给出了结果。请在我设置的大西洋/斯坦利所在的位置填写您想要的时区,因为不同时区的同一时间点的月份不会改变。您是否同意我的观点,即这段代码更清晰、更自然,并且减少了困惑的空间?顺便说一句,如果您只对日期感兴趣,而不是一天中的时间,请使用 LocalDate
而不是 ZonedDateTime
,其余代码将是相同的。
要获取特定月份的数字:
int januaryNumber = Month.JANUARY.getValue(); // 1
int februaryNumber = Month.FEBRUARY.getValue(); // 2
你的代码发生了什么?
作为 T.J. Crowder 已经说过,Calendar.get
需要一个字段编号,例如 Calendar.MONTH
或 Calendar.YEAR
。 Calendar.JANUARY
是 0。零?! Calendar
的另一个令人困惑的事情是,月份数字是从 0 开始的,也就是说,它们从 1 月的 0 到 12 月的 11。不管怎样,0 也是Calendar.ERA
的字段号。 GregorianCalendar
使用 0 表示 BC(或更宗教中立:BCE 表示公元纪元之前),1 表示 AD(CE,公元纪元)。由于您的日期属于公历,因此您得到 1。顺便说一句,这对于 1 月份来说是不正确的,因为月份是从 0 开始的。
类似地,Calendar.FEBRUARY
等于 1,并且与字段号 Calendar.YEAR
一致,这就是您获得年份的原因。
链接
关于java - 公历给我 2018 年 int 月份 = calendar.get(Calendar.FEBRUARY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50434510/