在Java中将String转换为Calendar对象

时间:2011-03-14 16:08:06

标签: java date datetime calendar simpledateformat

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

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

  

2011年3月14日星期四16:02:37 GMT

进入日历对象,以便我可以像这样轻松地拉出年份和月份:

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

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

任何建议都会有所帮助!

8 个答案:

答案 0 :(得分:358)

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


另见

答案 1 :(得分:14)

好吧,我认为复制已经存在于SimpleDateFormat等类中的代码是个坏主意。

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

答案 2 :(得分:13)

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

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日16:02:37 GMT 2011

     

zdt:2011-03-14T16:02:37Z [GMT]

     

ym:2011-03

实时代码

请参阅this code running in IdeOne.com

转换

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

GregorianCalendar gc = GregorianCalendar.from( zdt );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:9)

不需要创建新日历,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();

(我无法发表评论,这就是我创建新答案的原因)

答案 4 :(得分:5)

SimpleDateFormat非常棒,请注意,HHhh在使用小时时有所不同。 HH将以24小时为单位返回小时,并且将返回12小时的小时数。

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

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

虽然这将在24小时后返回:

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

答案 5 :(得分:3)

是的,自己解析是不好的做法。看看SimpleDateFormat,它会将字符串转换为日期,您可以将日期设置为日历实例。

答案 6 :(得分:1)

使用时区解析时间,模式中的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

enter image description here

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

中设置的时区

答案 7 :(得分:0)

简单方法:

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