3 回答
TA贡献1794条经验 获得超7个赞
现代方法使用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日星期一格林尼治标准时间
zdt:2011-03-14T16:02:37Z [GMT]
ym:2011-03
现场代码
请参阅在IdeOne.com中运行的代码。
转换次数
如果必须有一个Calendar对象,则可以GregorianCalendar使用添加到旧类的新方法转换为。
GregorianCalendar gc = GregorianCalendar.from( zdt );
关于java.time
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
在哪里获取java.time类?
Java SE 8和 SE 9及更高版本
内置的
标准Java API的一部分,具有捆绑的实现。
Java 9添加了一些次要功能和修复。
Java SE 6和 SE 7
java.time的许多功能在ThreeTen- Backport中都被反向移植到Java 6和7 。
安卓系统
所述ThreeTenABP项目适应ThreeTen-反向移植为Android(上面提到的)特异性。
请参阅如何使用…。
该ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多。
TA贡献1880条经验 获得超4个赞
好吧,我认为复制像这样的类中已经存在的代码将是一个坏主意SimpleDateFormat。
在另一方面,我个人会建议避免Calendar和Date完全如果可以的话,并使用约达时间,而不是作为一个更好的设计的日期和时间API。例如,你需要知道,SimpleDateFormat是不是线程安全的,所以你要么需要线程本地人,同步,或一个新实例每次使用它的时候。Joda解析器和格式化程序是线程安全的。
- 3 回答
- 0 关注
- 484 浏览
添加回答
举报