为了账号安全,请及时绑定邮箱和手机立即绑定

将字符串转换为Java中的日历对象

将字符串转换为Java中的日历对象

慕村9548890 2019-12-11 15:09:56
我是Java新手,通常使用PHP。我正在尝试转换此字符串:2011年3月14日星期一格林尼治标准时间16:02:37放入Calendar对象,这样我就可以像这样轻松地提取Year和Month:String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);手动解析它不是一个好主意吗?使用子串方法?任何建议将帮助谢谢!
查看完整描述

3 回答

?
慕田峪9158850

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,和更多。



查看完整回答
反对 回复 2019-12-12
?
慕村225694

TA贡献1880条经验 获得超4个赞

好吧,我认为复制像这样的类中已经存在的代码将是一个坏主意SimpleDateFormat。


在另一方面,我个人会建议避免Calendar和Date完全如果可以的话,并使用约达时间,而不是作为一个更好的设计的日期和时间API。例如,你需要知道,SimpleDateFormat是不是线程安全的,所以你要么需要线程本地人,同步,或一个新实例每次使用它的时候。Joda解析器和格式化程序是线程安全的。



查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 452 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信