我对Java不熟悉,通常使用PHP。

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

格林威治标准时间2011年3月14日星期三16:02:37

放入一个日历对象,这样我就可以像这样轻松地拖动年和月:

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

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

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


当前回答

是的,如果你自己解析它,那将是一种糟糕的做法。看看SimpleDateFormat,它会将字符串转换为日期,您可以将日期设置为日历实例。

其他回答

SimpleDateFormat是伟大的,只是注意HH是不同于HH时,与小时。HH返回基于24小时的小时数,HH返回基于12小时的小时数。

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

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

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

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
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

简单的方法:

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

是的,如果你自己解析它,那将是一种糟糕的做法。看看SimpleDateFormat,它会将字符串转换为日期,您可以将日期设置为日历实例。

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

另一方面,我个人建议,如果可以的话,完全避免使用Calendar和Date,而使用Joda Time,这是一个设计得更好的日期和时间API。例如,您需要知道SimpleDateFormat不是线程安全的,因此每次使用它时,您要么需要线程局部变量、同步,要么需要一个新实例。Joda解析器和格式化器是线程安全的。