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();
但该方法会生成标准 ISO 8601 格式的字符串。toString
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 );
输入: 星期一 三月 14 16:02:37 GMT 2011
zdt: 2011-03-14T16:02:37Z[GMT]
ym: 2011-03
实时代码
请参阅此代码在 IdeOne.com 中运行。
转换
如果必须具有对象,则可以使用添加到旧类的新方法转换为公历
日历。Calendar
GregorianCalendar gc = GregorianCalendar.from( zdt );
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.time。java.sql.*
从哪里获取 java.time 类?