将string转换为Java中的日历对象

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

我想转换这个string:

Mon Mar 14 16:02:37 GMT 2011

到一个日历对象,以便我可以轻松地拉这样的年份和月份:

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

手动parsing是不是一个好主意? 使用子串方法?

任何build议将有助于感谢!

 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


也可以看看

  • 的Javadoc

那么,我认为复制已经存在于类SimpleDateFormat的代码是一个坏主意。

另一方面,我个人build议,如果可以的话,完全避免使用CalendarDate ,而使用Joda Time作为更好devise的date和时间API。 例如,您需要了解SimpleDateFormat 不是线程安全的,因此您每次使用时都需要线程本地化,同步或新实例。 Jodaparsing器和格式化程序线程安全的。

没有新的日历需要创build,SimpleDateFormat已经在下面使用日历。

 SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US); Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done Calendar cal = sdf.getCalendar(); 

(我不能评论,这就是为什么我创造了一个新的答案)

SimpleDateFormat非常好,只是注意到HHhhHH将返回24小时制,Hh将返回12小时制。

例如,以下将返回12小时的时间:

 SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa"); 

虽然这将返回24小时的时间:

 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 

是的,自己parsing它是不好的做法。 看看SimpleDateFormat ,它会将string转换为date,并且可以将date设置为日历实例。

TL;博士

 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

避免遗留的date时间类

现代的方法是使用java.time类。 旧的date时间类,如Calendar已被certificate是devise不佳,混乱,麻烦。

定义一个自定义的格式化程序来匹配你的stringinput。

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

parsing为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。

 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 ); 

input:2011年3月14日星期一16:02:37

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及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用…。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

简单的方法:

 public Calendar stringToCalendar(String date, String pattern) throws ParseException { String DEFAULT_LOCALE_NAME = "pt"; String DEFAULT_COUNTRY = "BR"; Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY); SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE); Date d = format.parse(date); Calendar c = getCalendar(); c.setTime(d); return c; } 

用时区parsing一次,模式中的Z是时区

 String aTime = "2017-10-25T11:39:00+09:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()); try { Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(aTime)); Log.i(TAG, "time = " + cal.getTimeInMillis()); } catch (ParseException e) { e.printStackTrace(); } 

输出:它将返回UTC时间

 1508899140000 

在这里输入图像描述

如果我们不像yyyy-MM-dd'T'HH:mm:ss那样设置时区。 SimpleDateFormat将使用设置中Setting的时区