如何从日期对象(java.util.Date
)中将月份作为整数?
如何从日期对象(java.util.Date
)中将月份作为整数?
Answers:
您还可以使用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();
请注意,此处的月份值是1到12,与cal.get(Calendar.MONTH)
adarshr的答案相反,月份值是0到11。
但是正如Basil Bourque在评论中所说,首选方法是Month
使用该LocalDate::getMonth
方法获取枚举对象。
ZoneId.of( "America/Montreal" )
。
Month
枚举对象,而不仅仅是一个整数。Month m = localDate.gotMonth();
见LocalDate::getMonth
方法。使用这样的对象可使您的代码自我记录,确保类型安全并保证有效值。请参阅Oracle的Enum教程。
date.toInstant()
并且碰巧正在与java.sql.Date
的孩子一起工作,java.util.Date
那么您将获得UnsupportedOperationException
。试试new java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
使用添加到该旧类中的新转换方法,可以轻松地进行来回转换。java.sql.Date.valueOf( myLocalDate )
而myJavaSqlDate.toLocalDate()
此外,JDBC驱动程序更新的JDBC 4.2或更高版本不再需要java.sql
可以直接地址类型,并java.time
通过类型ResultSet::getObject
和PreparedStatement::setObject
方法。
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
出于明显的原因,基于零,即一月== 0。现在,在API中已对此进行了很好的记录,但是对于初次使用的用户来说,仍然令人困惑。我还没有找到任何人可以告诉我他们为什么这么做的原因-也许我该问一个新的SO问题(尽管我担心那没有很好的背景:/)
getYear()
也是“没有任何明显的理由”,由1900减去
如果您使用Java 8日期API,则可以直接在一行中获取它!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
…要么…
int month = dateTime.getMonthOfYear();
DateTime
对象的月份。int month = dateTime.getMonthOfYear();
.toString("MM")
它,因为它显示出比“ MM”更多的可能性。
DateTimeZone
对象传递给该DateTime构造函数:DateTimeZone.forID( "America/Montreal" )
。
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.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-额外项目与其他类扩展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));
}
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1
返回的值从0开始,因此应在结果中加1。
new Date()
不使用来与当前时间约会System.currentTimeMillis
。另一个是不建议使用getMonth。