Java:从Date获取月份整数

Java: Get month Integer from Date

如何从Date对象(java.util.Date)获取整数作为整数?


1
2
3
4
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);


java.time(Java 8)

您还可以在Java 8中使用java.time包并将java.util.Date对象转换为java.time.LocalDate对象,然后只使用getMonthValue()方法。

1
2
3
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();

请注意,月份值在这里给出1到12,与adarshr的答案中的cal.get(Calendar.MONTH)相反,给出0到11之间的值。

但正如Basil Bourque在评论中所说,首选方法是使用LocalDate::getMonth方法获取Month枚举对象。


如果你使用Java 8 date api,你可以直接把它放在一行!

1
2
LocalDate today = LocalDate.now();
int month = today.getMonthValue();

乔达时间

或者,使用Joda-Time DateTime类。

1
2
3
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))

…要么…

1
int month = dateTime.getMonthOfYear();


TL;博士

1
2
3
4
5
myUtilDate.toInstant()                          // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC.
          .atZone(                              // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object.
              ZoneId.of("America/Montreal" )   // Better to specify desired/expected zone explicitly than rely implicitly on the JVM’s current default time zone.
          )                                     // Returns a `ZonedDateTime` object.
          .getMonthValue()                      // Extract a month number. Returns a `int` number.

java.time详情

Ortomala Lokni对使用java.time的回答是正确的。你应该使用java.time,因为它是对旧的java.util.Date/.Calendar类的巨大改进。请参阅java.time上的Oracle教程。

我将添加一些代码,展示如何使用java.time而不考虑java.util.Date,因为当你开始使用新代码时。

简而言之使用java.time ... Instant是UTC时间轴上的一个时刻。应用时区(ZoneId)以获得ZonedDateTime

Month类是一个复杂的枚举,代表一般的月份。该枚举有方便的方法,如获取本地化的名称。并且请放心,java.time中的月份数字是理智的,1-12,而不是java.util.Date/.Calendar中的零基础无意义(0-11)。

要获得当前的日期时间,时区至关重要。在任何时候,世界各地的日期都不一样。因此,如果接近月末/月初,那么全世界的月份就不一样了。

1
2
3
4
5
ZoneId zoneId = ZoneId.of("America/Montreal" );  // Or 'ZoneOffset.UTC'.
ZonedDateTime now = ZonedDateTime.now( zoneId );
Month month = now.getMonth();
int monthNumber = month.getValue(); // Answer to the Question.
String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

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

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

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8,Java SE 9,Java SE 10及更高版本

    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小功能和修复。
  • Java SE 6和Java SE 7

    • 许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport。
  • Android的

    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26),ThreeTenABP项目采用ThreeTen-Backport(如上所述)。请参见如何使用ThreeTenABP ....

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter等。


如果你不能使用Joda时间而你仍然生活在黑暗的世界:)(Java 5或更低版本)你可以享受这个:

注意:确保您的日期已经完成,格式为:dd / MM / YYYY

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
Make an int Month from a date
*/

public static int getMonthInt(Date date) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
    return Integer.parseInt(dateFormat.format(date));
}

/**
Make an int Year from a date
*/

public static int getYearInt(Date date) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
    return Integer.parseInt(dateFormat.format(date));
}


1
2
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1

返回值从0开始,因此您应该在结果中添加一个值。