【问题标题】:Why does this SimpleDataFormat parsing fail on Android?为什么这个 SimpleDataFormat 解析在 Android 上失败?
【发布时间】:2011-11-08 09:55:59
【问题描述】:
DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy");

sdf.parse("Sun Dec 13 10:00:00 UTC 2009")

结果

java.text.ParseException:无法解析的日期:UTC 时间 12 月 13 日星期日 10:00:00 2009

注意:此代码在普通 Java 应用程序中似乎可以工作,但在 Android 上似乎失败。

【问题讨论】:

  • 顺便说一句,我总是觉得这类问题对 SO 来说很不值得,在我找到解决方案之后删除这类问题会更​​好吗?
  • 我知道有一个重复的存在,检查this
  • 您的 Java 版本和语言环境是什么?对我来说,new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy").parse("Sun Dec 13 10:00:00 UTC 2009") 输出日期无一例外
  • 只是为了测试,反之亦然:System.out.println(sdf.format(new Date()))
  • 有人在安卓上试过这个吗?我发现它只发生在 Android 上...

标签: java android parsing simpledateformat


【解决方案1】:

它不适合我 - 也许您的默认语言环境使用不同的月份名称?指定格式的语言环境。

// Will definitely work
DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy",
                                      Locale.US);

// Will definitely not work
DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy",
                                      Locale.FRANCE);

// Might work - depends on default locale
DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy")

(问题在于一周中的日期和一年中的月份的名称,这显然是特定于文化的。日期和时间分隔符也可能有所不同。)

编辑:奇怪的是你仍然有问题。只是为了检查,请尝试运行以下简短但完整的程序:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;

public class Test {

    public static void main(String[] args) throws Exception {        
        DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy",
                                              Locale.US);
        sdf.parse("Sun Dec 13 10:00:00 UTC 2009");
    }
}

如果这不起作用,请尝试删除模式和文本的时区部分。我想知道它是否有问题。

编辑:如果 Android SimpleDateFormat 实现无法解析时区,您可能只需使用:

text = text.replace(" UTC ", " ");
Date parsed = sdf.parse(text);

...当然,将解析器上的时区设置为 UTC。您可能想先检查它是否包含“UTC”,以防您的数据格式发生变化。

【讨论】:

  • 啊哈,好主意! ;) 它是从远程服务器检索的数据,所以可能是不同的语言环境...
  • 真的很奇怪,但它对我不起作用,不适用于 Locale.US 或 Locale.ENGLISH...
  • Locale.getDefault() 返回 'en_NL'
  • 这就解释了。请注意,NL cab 在几个月内特别棘手,因为它可以与英语月份一起工作大约半年,直到它遇到一个不起作用的月份。
  • @SanderVersluys,如果您使用美国区域设置进行解析并使用默认区域设置进行格式化,您会得到什么。除非你得到同样的东西,否则我怀疑你会有问题,因为日和月是英文的。
【解决方案2】:

您的格式看起来正确。您是否有可能没有使用英语语言环境?格式化程序将采用您的系统区域设置,这可能导致“sun”和“dec”的名称不同

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多