6

我正在尝试将字符串解析为日期,这就是我所拥有的:

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss zZ (zzzz)");
Date date = new Date();
try {
    date = sdf.parse(time);
} catch (ParseException e) {
    e.printStackTrace();
}

要解析的字符串是这样的:

Sun Jul 15 2012 12:22:00 GMT+0300 (FLE Daylight Time)

我遵循了http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

很确定我已经按照书本做了所有事情。但它给了我ParseException

java.text.ParseException: Unparseable date: 
"Sun Jul 15 2012 12:22:00 GMT+0300 (FLE Daylight Time)"

我究竟做错了什么?我尝试过的模式:

EEE MMM dd yyyy HH:mm:ss zzz
EEE MMM dd yyyy HH:mm:ss zZ (zzzz)
4

5 回答 5

11

您似乎正在混合 和 的z模式Z。如果您忽略(FLE Daylight Time),因为这与 中的信息相同GMT+0300,问题就变成了SimpleDateFormat要么GMT +0300要么GMT+03:00。最后一个变体可以这样解析:

String time = "Sun Jul 15 2012 12:22:00 GMT+03:00 (FLE Daylight Time)";
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss zzz");
Date date = sdf.parse(time);

[编辑]
鉴于其他有关其时间字符串工作的帖子,这可能是因为您的时间字符串包含冲突信息或混合格式。

于 2012-07-12T07:12:28.587 回答
2

java.time

我想贡献现代答案。使用现代 Java 日期和时间 API java.time 进行日期和时间工作。

首先定义一个用于解析的格式化程序:

private static final DateTimeFormatter PARSER = DateTimeFormatter
        .ofPattern("EEE MMM dd yyyy HH:mm:ss 'GMT'Z (", Locale.ROOT);

然后这样解析:

    String time = "Sun Jul 15 2012 12:22:00 GMT+0300 (FLE Daylight Time)";
    
    TemporalAccessor parsed = PARSER.parse(time, new ParsePosition(0));
    OffsetDateTime dateTime = OffsetDateTime.from(parsed);
    
    System.out.println(dateTime);

输出是:

2012-07-15T12:22+03:00

我没有解析你的整个字符串,但足以建立一个时间点和与 GMT(或 UTC)的偏移量。Java 无法解析时区名称FLE Daylight Time。这是 Java 不知道的微软发明。所以我解析到FLE之前的圆括号,以验证这么多的字符串。为了指示DateTimeFormatter它不需要解析整个字符串,我使用了作为第二个参数的重载parse方法。ParsePosition

来自维基百科:

有时,由于它在 Microsoft Windows 上的使用,FLE 标准时间(芬兰、立陶宛、爱沙尼亚或有时芬兰、拉脱维亚、爱沙尼亚)……被用来指代东欧时间。

如果您不可或缺的需要一个Date对象,通常是用于您现在无法升级到 java.time 的遗留 API,请像这样转换:

    Date oldfashionedDate = Date.from(dateTime.toInstant());
    System.out.println(oldfashionedDate);

在欧洲/塔林时区运行时的输出:

2012 年 7 月 15 日星期日 12:22:00 EEST

你的代码出了什么问题?

SimpleDateFormat成功解析为与格式模式字符串中GMT+03的小字符匹配的“时区” 。z然后它尝试将剩余部分解析00为偏移量以匹配大写字母Z。由于偏移量需要符号,因此失败了。

我究竟做错了什么?

正如其他人所说,您不应该尝试解析GMT为时区缩写。GMT 可用作时区缩写;但你的时间不是格林威治标准时间。所以你不想要那个。这只会产生误导。如果你成功了,你宁愿冒一个不正确的结果的风险,因为你解析了一个不符合你目的的时区。

链接

于 2021-08-05T18:49:56.910 回答
1

试试这个方法。。

System.out.println(new SimpleDateFormat(
                "EEE MMM dd yyyy HH:mm:ss zZ (zzzz)").format(new Date()));

我得到的输出:

Thu Jul 12 2012 12:41:35 IST+0530 (India Standard Time)
于 2012-07-12T07:12:43.893 回答
1

您可以尝试打印日期格式字符串:

/**
 * @param args
 */
public static void main(String[] args) {
    SimpleDateFormat sdf = new SimpleDateFormat(
            "EEE MMM dd yyyy HH:mm:ss zZ (zzzz)");
    Date date = new Date();
    try {
        //
        System.out.println(sdf.format(date));
        date = sdf.parse(time);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2012-07-12T07:15:51.087 回答
1

如果您对语言环境有疑问,您可以为整个应用程序设置默认语言环境

Locale.setDefault(Locale.ENGLISH);

或者只是在你的SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss zZ (zzzz)", Locale.ENGLISH);

您也可以使用Locale.USLocale.UK

于 2012-07-12T07:27:05.747 回答