首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中将字符串转换为Calendar对象

在Java中将字符串转换为Calendar对象
EN

Stack Overflow用户
提问于 2011-03-15 00:08:06
回答 8查看 371.3K关注 0票数 195

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

我正在尝试转换这个字符串:

Mon Mar 14 16:02:37 GMT 2011

放到一个Calendar对象中,这样我就可以像这样轻松地提取年份和月份:

代码语言:javascript
复制
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-03-15 00:16:52

代码语言:javascript
复制
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

另请参阅

票数 438
EN

Stack Overflow用户

发布于 2016-11-02 06:44:51

tl;dr

现代方法使用java.time类。

代码语言:javascript
复制
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,已被证明设计不佳、令人困惑和麻烦。

定义一个自定义格式化程序以匹配您的字符串输入。

代码语言:javascript
复制
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );

解析为ZonedDateTime

代码语言:javascript
复制
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

您感兴趣的是年份和月份。为此,java.time类包括YearMonth类。

代码语言:javascript
复制
YearMonth ym = YearMonth.from( zdt );

如果需要,您可以询问年份和月份的数字。

代码语言:javascript
复制
int year = ym.getYear();
int month = ym.getMonthValue();

但是toString方法生成标准ISO 8601格式的字符串。

代码语言:javascript
复制
String output = ym.toString();

把这些放在一起。

代码语言:javascript
复制
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();

转储到控制台。

代码语言:javascript
复制
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );

输入: Mon Mar 14 16:02:37 GMT 2011 zdt: 2011-03-14T16:02:37ZGMT ym: 2011-03

实时代码

参见this code running in IdeOne.com

转换

如果必须使用Calendar对象,则可以使用添加到旧类中的新方法转换为GregorianCalendar

代码语言:javascript
复制
GregorianCalendar gc = GregorianCalendar.from( zdt );

关于java.time

框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310

现在在maintenance mode中的项目建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*类。Hibernate 5和JPA2.2支持java.time。

从哪里获取java.time类?

  • ,、、和更高版本-标准Java API的一部分,具有捆绑的实现。
    • 带来了一些次要的特性和fixes.

  • 和.

中的

  • 大多数java.time功能已向后移植到Java6和7

    • 更高版本的Android (26+)捆绑了java.time类的实现。
    • 对于较早的Android (<26),的进程带来了最初没有内置到Android中的subset of the 功能。
      • 如果去糖化没有提供你需要的东西,项目会让 (上面提到的)适应安卓系统。请参阅.
票数 23
EN

Stack Overflow用户

发布于 2011-03-15 00:11:32

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

另一方面,我个人建议如果可以的话,完全避免使用CalendarDate,而使用Joda Time,作为一种设计得更好的日期和时间应用编程接口。例如,您需要知道SimpleDateFormat不是线程安全的,因此您要么需要线程本地变量、同步,要么每次使用它时都需要一个新实例。Joda解析器和格式器是线程安全的。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5301226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档