java - 公历给我 2018 年 int 月份 = calendar.get(Calendar.FEBRUARY)

标签 java calendar gregorian-calendar

所以我正在开发一个日历程序并更改月份,我要求输入月份的整数。

如果我输入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.MONTHCalendar.YEARCalendar.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/

相关文章:

java - 公历错误时间

Java 关于返回值及其参数的方法的逻辑

Java:调用方法的 "Break"循环?

java 日历格式

javascript - 使用 JavaScript 自定义日历

java - 使用 GregorianCalendar 自定义日期格式

java - 在 Java 中获取准确的日期而不干扰 XMLGregorianCalendar

java - 不弹出另存为对话框

java - 使用 Tomcat 运行 Angular 2 应用程序

php - 如何通过语言环境字符串获取日历类型