【问题标题】:Parse a String to Date in Java在 Java 中将字符串解析为日期
【发布时间】:2012-07-11 21:12:30
【问题描述】:

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

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)

【问题讨论】:

  • 我觉得应该是"... zz (zzzz),你把Z大写了。
  • @JoachimSauer 不幸的是问题仍然存在
  • Here 它是 :D 我认为这可以满足您的需求 :D
  • time 字符串从何而来?

标签: java string date simpledateformat


【解决方案1】:

您似乎混合了zZ 的模式。如果您忽略(FLE Daylight Time),因为这与GMT+0300 中的信息相同,问题就变成SimpleDateFormat 想要GMT +0300GMT+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);

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

【讨论】:

  • 您需要将: 添加到您的时间字符串中才能正常工作。
  • 你确定因为......使用:EEE MMM dd yyyy HH:mm:ss zzz,当我打印出来时:` Date date = new Date(); ` ,然后显示格式:System.out.println(sdf.format(date));,它打印:Thu Jul 12 2012 10:47:09 EEST
  • 其实我是这样做的,而且效果很好……time = time.substring(0, 31) + ":" + time.substring(31);。看起来很奇怪,没有更简单的方法哈哈?
  • 就像我说的那样,您的 time 字符串似乎以一种不幸的方式使用混合格式,这给 SimpleDateFormat 带来了麻烦,所以如果您有任何方法以更友好的模式生成它,这肯定会有所帮助。
  • 问题是由于 GMT 或 EEET 时区不同而出现的,所以我只是将其减少到只需要我需要的时间。直到分秒。 time = time.substring(0, 21);
【解决方案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 夏令时。这是 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可以作为时区缩写;但你的时间不是格林威治标准时间。所以你不想要那个。这只会产生误导。如果您成功了,您宁愿冒错误结果的风险,因为您解析的时区不符合您的目的。

链接

【讨论】:

    【解决方案3】:

    试试这个方法..

    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)
    

    【讨论】:

    • 它使用的是我自己的语言,不是英语,天哪,N Juuli 12 2012 10:19:35 EEST+0300 (Eastern European Summer Time)
    • 使用SimpleDateFormat(String pattern, Locale.US)
    • @Subs 使用了语言环境,但仍然出现异常。
    【解决方案4】:

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

    /**
     * @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();
        }
    }
    

    【讨论】:

    • 它正在使用我的语言,wtf,我希望它使用英语。 N Juuli 12 2012 10:18 EEST+0300 (Eastern European Summer Time)
    【解决方案5】:

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

    Locale.setDefault(Locale.ENGLISH);
    

    或者只是在您的SimpleDateFormat 上使用英语语言环境

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

    您也可以使用Locale.USLocale.UK

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多