tl;博士
YearMonth ym =
YearMonth.from(
LocalDateTime.parse( "2012-11-07T13:28:23" )
)
int month = ym.getMonthValue();
int year = ym.getYear();
细节
其他答案是正确的,尤其是Jon Skeet 的答案。
让我补充一点,您正在使用麻烦的旧旧日期时间类。避开他们。
java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到 java.time。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。
许多 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP中进一步适应Android。
ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。
解析字符串
您的输入字符串缺少有关从 UTC 偏移或时区的任何信息。因此,我们将其解析为LocalDateTime
“本地”表示任何位置,而不是特定位置。因此,它代表了关于可能时刻的粗略想法,但不是时间线上的实际点。
ISO 8601
字符串的格式符合ISO 8601标准。java.time 类在解析和生成 String 对象时默认使用这些标准格式。所以不需要定义解析模式。
String input = "2012-11-07T13:28:23";
LocalDateTime ldt = LocalDateTime.parse( input );
获取年月
生成的对象对您想要的部分有更好的方法以及更多。
与旧班级遇到的麻烦不同,获得年份会呈现实际的年份。对于 2016 年,您将获得2016
.
int year = ldt.getYear(); // 2016
对于一个月,getter 会从方便的Month
枚举中为您提供一个对象。在您的代码库中使用此类对象而不是单纯的整数,以受益于类型安全、有保证的有效值和更多的自记录代码。
Month month = ldt.getMonth();
但如果你必须,你可以要求一个数字,1-12(不是你在旧班级看到的疯狂的 0-11)。
int monthNumber = month.getValue();
YearMonth
有一个类用于表示没有日期的年份和月份,YearMonth
. 我建议传递此类的对象,而不仅仅是整数。这样做会带来类型安全、有效值和自记录代码。
YearMonth ym = YearMonth.from( ldt );