tl;博士
现代方法使用 java.time 类。
YearMonth.from(
ZonedDateTime.parse(
"Mon Mar 14 16:02:37 GMT 2011" ,
DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
)
).toString()
2011-03
避免使用旧的日期时间类
现代方法是使用 java.time 类。旧的日期时间类(例如 Calendar)已被证明设计不佳、令人困惑且麻烦。
定义一个自定义格式化程序以匹配您的字符串输入。
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
解析为ZonedDateTime。
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
您对年份和月份感兴趣。为此目的,java.time 类包括 YearMonth 类。
YearMonth ym = YearMonth.from( zdt );
如果需要,您可以查询年份和月份数字。
int year = ym.getYear();
int month = ym.getMonthValue();
但toString 方法会生成标准ISO 8601 格式的字符串。
String output = ym.toString();
把这些放在一起。
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();
转储到控制台。
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
输入:2011 年 3 月 14 日星期一 16:02:37 GMT
zdt: 2011-03-14T16:02:37Z[GMT]
名称:2011-03
实时代码
见this code running in IdeOne.com。
转化
如果您必须有一个Calendar 对象,您可以使用添加到旧类的新方法转换为GregorianCalendar。
GregorianCalendar gc = GregorianCalendar.from( zdt );
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time。
从哪里获取 java.time 类?