在 Java 中将字符串转换为日历对象tl;博士避免使用旧日期时间类关于 java.time

我是Java的新手,通常使用PHP。

我正在尝试转换此字符串:

星期一 三月 14 16:02:37 GMT 2011

放入日历对象中,以便我可以像这样轻松地拉动年和月:

String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);

手动解析它是一个坏主意吗?使用子字符串方法?

任何建议都会有帮助,谢谢!


答案 1
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done

注意:根据您的环境/要求进行设置Locale


另请参见


答案 2

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.DateCalendarSimpleDateFormat

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.timejava.sql.*

从哪里获取 java.time 类?