SimpleDateFormat 中的可选部分

我正在读取可能带有或不带有时区调整的日期字符串:yyyyMMddHHmmsszyyyyMMddHHmmss.当字符串缺少区域时,我会将其视为 GMT.我没有看到在 SimpleDateFormat 中创建可选部分的任何方法,但也许我遗漏了一些东西.有没有办法用 SimpleDateFormat 来做到这一点,还是我应该写一个新的具体 DateFormat 来处理这个?

I'm reading in date strings that could be with or without a time zone adjustment: yyyyMMddHHmmssz or yyyyMMddHHmmss. When a string is missing a zone, I'll treat it as GMT. I'm not seeing any way to create optional sections in a SimpleDateFormat, but maybe I'm missing something. Is there a way to do this with a SimpleDateFormat, or should I just write a new concrete DateFormat to handle this?

推荐答案

我会创建两个 SimpleDateFormat,一个有时区,一个没有.您可以查看 String 的长度来确定使用哪一个.

I would create two SimpleDateFormat, one with a time zone and one without. You can look at the length of the String to determine which one to use.

听起来您需要一个代表两个不同 SDF 的 DateFormat.

Sounds like you need a DateFormat which delegates to two different SDF.

DateFormat df = new DateFormat() {
    static final String FORMAT1 = "yyyyMMddHHmmss";
    static final String FORMAT2 = "yyyyMMddHHmmssz";
    final SimpleDateFormat sdf1 = new SimpleDateFormat(FORMAT1);
    final SimpleDateFormat sdf2 = new SimpleDateFormat(FORMAT2);
    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Date parse(String source, ParsePosition pos) {
        if (source.length() - pos.getIndex() == FORMAT1.length())
            return sdf1.parse(source, pos);
        return sdf2.parse(source, pos);
    }
};
System.out.println(df.parse("20110102030405"));
System.out.println(df.parse("20110102030405PST"));

相关文章