当前位置: 首页 > 知识库问答 >
问题:

Java公历返回错误的月份

楚皓君
2023-03-14

所以我已经研究了几个小时了,它返回了正确的年和日,但是由于一些奇怪的原因,它返回了错误的月份。我确信这是一个简单的修复,但我似乎无法解决这个问题。

package gregoriancalendar;

import java.util.GregorianCalendar;

public class Calendar8_5 {



public static void main(String[] args){

GregorianCalendar calendar = new GregorianCalendar();
System.out.println("Current Year, Month & Date: ");
System.out.println("Year is " + calendar.get(1));
System.out.println("Month is " + calendar.get(2));
System.out.println("Day is " + calendar.get(5));


calendar.setTimeInMillis(1234567898765L);
//Elapse Time
System.out.println("Set Value of 1234567898765L");
System.out.println("Year is " + calendar.get(1));
System.out.println("Month is " + calendar.get(2));
System.out.println("Day is " + calendar.get(5));
   }
  }

共有3个答案

宁欣怿
2023-03-14

尝试使用Java 8提供的新日期和时间库,它受Joda time的启发,易于使用。它还解决了月份从0开始的问题。

谈灵均
2023-03-14

出于某些疯狂的原因,Calendar类对月份(一月=0,二月=1,等等)使用一个以零为基础的索引,但所有其他日期部分都是以一为基础的(与它们的实际数字相匹配)。

据推测,这是在一些蹩脚的枚举尝试中完成的,但这太愚蠢了。

我的建议是永远不要使用日历。改用Joda-Time。

吴哲
2023-03-14

要获取当月的数字1-12:

LocalDate.now()
         .getMonthValue()

最好指定你想要/期望的时区。

LocalDate.now( 
    ZoneId.of( "America/Montreal" ) 
).getMonthValue()

类似地调用。getYear()。getDayOfMonth()

它返回了错误的月份

正如其他人所说,在Calendar中,1-12月份被疯狂地编号为0-11而不是1-12。旧日期时间类中许多糟糕的设计决策之一。这些类现在是遗留的,被java.time类取代。

那么有没有解决这个问题的办法?

是的,有一个解决方法。使用一个好的日期时间库,而不是乱七八糟java.util.日期/日历。现代的方法是使用java.time类。

时区对于获取当前日期和时间至关重要。对于任何给html" target="_blank">定时刻,日期和挂钟时间因地区而异。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now( z );

您可以通过Month枚举查询各种组件,例如年份、月份编号、本地化的月份名称和月中日。

System.out.println ( "Current: " + zdt );
System.out.println( "Year is " + zdt.getYear() );
System.out.println( "Month is " + zdt.getMonthValue() );
System.out.println( "Month name is " + zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) );  // Or Locale.US, Locale.ITALY, etc.
System.out.println( "Day is " + zdt.getDayOfMonth() );

当前:2016-12-14T04:54:44.802-05:00[美国/蒙特利尔]

今年是2016年

月份是12

月名是décembre

今天是14天

查看IdeO中的实时代码ne.com.

如果只关心日期而不关心一天中的时间,请使用LocalDate类。

LocalDate.now( z );

您可以将时刻指定为自UTC中1970年第一个时刻以来的毫秒计数。

long input = 1_234_567_898_765L ;
Instant instant = Instant.ofEpochMilli( input );

瞬间toString():2009-02-13T23:31:38.765Z

该输出中的ZZulu的缩写,表示UTC。

您可以指定一个时区来调整特定的挂钟时间。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString(): 2009-02-13T18:31:38.765-05:00[美国/蒙特利尔]

查看IdeO中的实时代码ne.com.

我不建议以这种方式交换日期时间数据。最好序列化为ISO 8601格式的文本。例如:2009-02-13T23:31:38.765Z

爪哇。时间框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,比如java。util。日期日历

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310。

在哪里可以获得java。时间课?

  • Java SE 8和SE 9及更高版本
  • 许多java.time功能被反向移植到Java6
  • ThreeTenABP项目专门为Android改编了ThreeTen Backport(如上所述)
  • 看看如何使用

额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,等等。

更新:Joda Time项目现在处于维护模式,建议迁移到java。时间课。

  • 现在使用Joda Time 2.3
  • 将来,在Java 8中,考虑使用JSR 310:Date and Time API,它将取代日期/日历类,并受Joda Time的启发
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;

// Generally best to be explicit about time zone rather than depend on default.
DateTimeZone denverTimeZone = DateTimeZone.forID( "America/Denver" );
java.util.Locale locale = Locale.FRANCE;

DateTime now = new DateTime( denverTimeZone );

System.out.println( "Current Year, Month & Day for: " + now );
System.out.println( "Year is " + now.year().getAsText( locale ) );
System.out.println( "Month is " + now.monthOfYear().getAsText( locale ) );
System.out.println( "Day is " + now.dayOfMonth().getAsText( locale ) );
System.out.println(); // blank line.

跑步时…

Current Year, Month & Day for: 2013-12-04T01:58:24.322-07:00
Year is 2013
Month is décembre
Day is 4
// Not generally a good idea to focus on integers for working with date-time, but you asked for it.
DateTime someDateTime = new DateTime( 1234567898765L, DateTimeZone.UTC );

System.out.println( "Set Value of 1234567898765L is: " + someDateTime );
System.out.println( "Year is " + someDateTime.year().getAsText( locale ) );
System.out.println( "Month is " + someDateTime.monthOfYear().getAsText( locale ) );
System.out.println( "Day of month is " + someDateTime.dayOfMonth().getAsText( locale ) );
System.out.println( "Day of week is " + someDateTime.dayOfWeek().getAsText( locale ) );
System.out.println( "Day of year is " + someDateTime.dayOfYear().getAsText( locale ) );

跑步时…

Set Value of 1234567898765L is: 2009-02-13T23:31:38.765Z
Year is 2009
Month is février
Day of month is 13
Day of week is vendredi
Day of year is 44

另外,当我注意到你随意选择的结果是13号星期五时,我感到很冷!

 类似资料:
  • 问题内容: 所以我在这里呆了几个小时,它返回正确的Year和Day,但是由于某种奇怪的原因,它返回了错误的月份。我确定它是一个简单的修复程序,但我似乎无法弄清楚。 问题答案: 要获得本月的1-12数字: 最好指定所需/预期的时区。 类似地,呼叫和。 细节 它返回错误的月份 就像其他人所说的,在 1月至12月的 几个月中,他们疯狂地编号为0-11, 而不是1-12。在旧的日期时间类中,许多糟糕的设计

  • 问题内容: 执行以上代码段后,month的值为10而不是11。 问题答案: 月份从0而不是1索引,因此10是11月,而11是12月。

  • 问题内容: 我尝试使用日历设置若干年后的简单日期: 字符串日期是此方法的参数。 我的问题是,否则日期返回还可以,但是月份数字完全错误,并且每次运行时看起来都越来越大!我想念的是什么? 问题答案: 测试

  • 我有一个验证方法,将两个输入作为开始日期和结束日期,并检查结束日期是否有效,即在开始日期之后。我使用Calendar方法获取两个日期的毫秒数并得到差值。如果差值为负值,则其无效的结束日期,即结束日期早于开始日期。结束日期的毫秒值应始终大于开始日期。但在某些情况下,在开始日期的情况下,getTimeInMillis()会提供更大的值。 这是我的代码: 输出为: 这里2015-01-31是开始日期,2

  • 问题内容: 我正在使用和函数在下拉列表中显示接下来的3个月。 PHP代码: 但是,如果脚本在服务器日期为30日或31日时运行,则下个月(二月)将显示为三月。即上面的脚本应该返回 但是,相反,它实际上显示 那是因为2月没有30号或31号,所以脚本将“ 31/02”转换为“ 01/03”。 我已经阅读了php.net上的页面,此问题已经提出,但是还没有任何有用的解决方案。因此,有人可以帮助我找到解决此

  • 我想在将一周的第一天设置为周日后,将2018年10月9日这一周作为一年中的42周。我仍然从下面的代码片段中得到41的输出 我错过了什么吗? 背景:我们一周的开始可能是可变的。我们的配置能够让用户决定一周的第一天。