Java:从Date获取月份整数

Muh*_*uhd 145 java calendar date

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

ada*_*shr 278

java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`Calendar.MONTH`是基于ZERO的无明显原因,即1月== 0.现在已经在API中记录得很好,但是对于初次使用的用户而言,它仍然令人困惑.我还没有找到能告诉我他们为什么会这样做的人 - 也许是时候自己提出一个新的问题了(尽管我担心没有任何好的背景:/) (161认同)
  • @Voo Date.getMonth()方法基于零,这可能是Calendar.MONTH的主要原因. (5认同)
  • 实际上已经有人问过这个问题了(不仅如此).底线是tnat,这是设计糟糕的API的结果.我的意思是,你提到整个Date类是一个笑话.有趣的是,不仅Java遇到了这个问题 - iirc JavaScript的Date getMonth()也以0开头! (2认同)

Ort*_*kni 44

java.time(Java 8)

您还可以在Java 8中使用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();
Run Code Online (Sandbox Code Playgroud)

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

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


小智 13

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

LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Run Code Online (Sandbox Code Playgroud)


小智 7

乔达时间

或者,使用Joda-Time DateTime课程.

//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
Run Code Online (Sandbox Code Playgroud)

…要么…

int month = dateTime.getMonthOfYear();
Run Code Online (Sandbox Code Playgroud)

  • 更简单的是,只需询问`DateTime`对象的月份.`int month = dateTime.getMonthOfYear();` (2认同)

Bas*_*que 6

TL;博士

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.
Run Code Online (Sandbox Code Playgroud)

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

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

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 );
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

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

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

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


Bad*_*IFI 6

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

注意:请确保您的日期已按格式: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));
}
Run Code Online (Sandbox Code Playgroud)