解析稍有不同格式的日期/时间字符串的最有效方法

时间:2014-04-24 10:20:25

标签: java android json datetime

我正在从服务器解析JSON,并在其中使用一些类似但日期不同的格式,有些看起来像:

2013-12-13T09:59:59Z

我可以使用

解析
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

而其他人看起来像

2013/11/14 11:00:14 -0500

我可以使用

解析
SimpleDateFormat("yyyy/MM/dd HH:mm:ss ZZZ")

有更通用的方法吗?如果有一个标准方法服务器端显然会更好,但我无法改变它。

4 个答案:

答案 0 :(得分:0)

如果您只有两种格式的变体,则可以使用以下代码:

SimpleDateFormat iso = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX");
SimpleDateFormat other = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss XX");

String input = "2013/11/14 11:00:14 -0500";
Date result;

if (input.indexOf('/') != -1) { // or: input.charAt(4) == '/'
  result = other.parse(input);
} else {
  result = iso.parse(input);
}

注意:对于Android,您必须使用ZZ而不是XX,但我不确定Android上的ZZ是否可以正确解析ISO输入中的Z符号。如果有疑问(测试!),您有另一种格式变体,您必须以特定方式处理(使用类似input.endsWith("Z")的内容)。

答案 1 :(得分:0)

你可以用它。 你的日期格式不应该是暧昧的,例如" 07/08/2013"可以是" dd / MM / YYYY"或" MM / dd / YYYY"。

private static Date parseDate(String dateString, DateFormat... dateFormats)
{
    Date date = null;

    for (DateFormat df : dateFormats)
    {
        try
        {
            date = df.parse(dateString);
            break;
        }
        catch (ParseException e)
        {
            // Ignore. Try next date format
        }
    }
    return date;
}

答案 2 :(得分:0)

我觉得最好保留可能出现在数组中的所有日期格式,然后通过使用foreach循环,您可以检查哪种格式最适合,并且您可以通过这种方式解析它。 我使用以下代码来实现它,

public static String postedTimeFormat(String inPostedTime) {

        String[] formats = {
                "EEE MMM dd HH:mm:ss Z yyyy", "yyyy-MM-dd'T'HH:mm:ss",
                "yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd'T'HH:mm:ssZ", 
                "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-dd'T'HH:mm:ss.SSSZ", 
                "yyyy-MM-dd HH:mm:ss", "MM/dd/yyyy HH:mm:ss", 
                "MM/dd/yyyy'T'HH:mm:ss.SSS'Z'", "MM/dd/yyyy'T'HH:mm:ss.SSSZ", 
                "MM/dd/yyyy'T'HH:mm:ss.SSS", "MM/dd/yyyy'T'HH:mm:ssZ", 
                "MM/dd/yyyy'T'HH:mm:ss", "yyyy:MM:dd HH:mm:ss",
                "yyyyMMdd", "yyyy-MM-dd" ,
                "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mmZ",
        "yyyy-MM-dd HH:mm:ss.SSSZ"};

        if (inPostedTime != null) {
            for (String format : formats) {
                SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US);
                try {
                    sdf.parse(inPostedTime);
                    return format;

                } catch (ParseException e) {
                }
            }
        }
        return null;
    }

答案 3 :(得分:0)

通过执行此类操作,将日期标准化为一种格式。

  • 将所有/个字符替换为-
  • 将第一个空格字符替换为T
  • 将任何后续空格字符替换为空字符串。

完成后,您应该能够使用

解析生成的字符串
"yyyy-MM-dd'T'HH:mm:ssX"

如果您在Android代码中执行此操作,则还需要一个步骤:

  • 将任何Z替换为+00:00

你需要用

进行解析
"yyyy-MM-dd'T'HH:mm:ssZ"