如何从一个java.util.Date
对象中获取月份的整数值?
如何从一个java.util.Date
对象中获取月份的整数值?
java.util.Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
之所以从零开始计数,即一月==0,原因不明。虽然在 API 中有良好的文档记录,但对于第一次使用者来说仍然非常困惑。我还没有找到任何人能告诉我为什么会这样 - 或许是时候我自己发一个新的 SO 问题了(尽管我担心并没有太多的背景信息 :/)。 - VoogetYear()
也会被“毫无理由地”减去1900。 - Hele您还可以在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();
cal.get(Calendar.MONTH)
(取值范围为0到11)相反。LocalDate::getMonth
方法获取一个Month
枚举对象。ZoneId.of("America/Montreal")
。 - Basil BourqueMonth
枚举对象,而不仅仅是一个整数。Month m = localDate.gotMonth();
参见 LocalDate::getMonth
方法。使用这样的对象可以使您的代码自我记录,确保类型安全,并保证有效值。请参阅 Oracle 的 枚举教程。 - Basil Bourquedate.toInstant()
并且您正在使用 java.sql.Date
(java.util.Date
的子类),那么您将会得到一个 UnsupportedOperationException
。请尝试使用 new java.sql.Date(src.getTime()).toLocalDate()
。 - Adamjava.sql.Date
转换为/从更容易。 java.sql.Date.valueOf(myLocalDate)
和 myJavaSqlDate.toLocalDate()
此外,针对 JDBC 4.2 或更高版本更新的 JDBC 驱动程序不再需要 java.sql
类型,并且可以通过 ResultSet::getObject
和 PreparedStatement::setObject
方法直接访问 java.time
类型。 - Basil Bourque如果你使用Java 8的日期API,可以在一行代码中直接获取它!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
DateTime
对象的月份即可。 int month = dateTime.getMonthOfYear();
- Basil Bourque.toString("MM")
,因为它显示了除了"MM"之外的更多可能性。 - ssowardDateTimeZone
对象传递给该DateTime构造函数:DateTimeZone.forID("America/Montreal")
。 - Basil BourquemyUtilDate.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类的巨大改进。请参阅Oracle Tutorial上的java.time。
我将添加一些代码,展示如何在不考虑java.util.Date的情况下使用java.time,适用于你从头开始编写代码的时候。
简述使用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 );
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-Extra项目扩展了java.time的附加类。该项目是java.time可能未来添加的可靠依据。您可能会在这里找到一些有用的类,例如Interval
, YearWeek
, YearQuarter
以及更多。
如果您无法使用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));
}
如果我们使用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
YearMonth.now()
或 MonthDay.now()
。并且可以向 now
方法传递一个 ZoneId
,以明确操作是基于时区的。 - Ole V.V.Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1
返回值从0开始,因此您应该将结果加一。
new Date()
而不需要 System.currentTimeMillis()
来获取当前时间。另一个问题是 getMonth
已经被弃用。 - Muhd