Java: 从日期获取月整数

如何从 Date 对象(java.util.Date)获取整数形式的月份?

437497 次浏览
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);

Joda 时间

或者,使用 Joda 时间 DateTime类。

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

或者..。

int month = dateTime.getMonthOfYear();
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1

返回的值从0开始,因此应该向结果添加1。

Time (Java8)

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

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枚举对象。

博士

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.util 有了巨大的改进。日期/。日历课。在 java.time 上查看 Oracle 教程

我将添加一些代码,演示如何在不考虑 java.util 的情况下使用 java.time。开始使用新代码时的日期。

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

Month类是一个复杂的 枚举,通常代表一个月。枚举具有方便的方法,例如获取本地化名称。请放心,java.time 中的月份号是正常的,1-12,而不是 java.util 中从零开始的废话(0-11)。日期/。日历。

为了得到当前的日期时间,时区是至关重要的。在任何时候的日期是 没有相同的世界各地。因此,如果接近月底/月初,世界各地的月份是不一样的。

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 );

关于 爪哇时间

< em > java.time 框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

现在在 维修模式中的 尤达时间项目建议迁移到 爪哇时间类。

要了解更多,请参阅 < em > Oracle 教程 。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

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

从哪里获得 java.time 类?

  • Java SE 8 < strong > JavaSE9 < strong > JavaSE10 和更高版本
    • 内置的。
    • 带有捆绑实现的标准 JavaAPI 的一部分。
    • Java9添加了一些次要的特性和修复。
  • Java SE 6 和 < a href = “ https://en.wikipedia.org/wiki/Java _ version _ history # Java _ SE _ 7”rel = “ noReferrer”> < strong > Java SE 7
  • 仿生人
    • Java.time 类的 Android 捆绑包实现的后续版本。
    • 对于早期的 Android (< 26) ,项目适用于 310-后端口(上面提到过)。

< strong > Three Ten-Ultra 项目使用其他类扩展 java.time。这个项目是将来可能添加 java.time 的试验场。您可以在这里找到一些有用的类,比如 IntervalYearWeekYearQuarter更多

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

注意: 确保您的日期已经按照 dd/MM/YYYY 格式生成

/**
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));
}

如果您使用 爪哇8日期 api,您可以直接得到它在一行!

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

如果我们使用 java.time.LocalDate api,我们可以在单行中得到整数形式的月份号:

import java.time.LocalDate;
...
int currentMonthNumber = LocalDate.now().getMonthValue(); //OR
LocalDate scoringDate = LocalDate.parse("2022-07-01").getMonthValue(); //for String date

例如,今天的日期是2022年7月29日,产量将是7。