Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleDataFormat时区解析_Java_Simpledateformat - Fatal编程技术网

Java SimpleDataFormat时区解析

Java SimpleDataFormat时区解析,java,simpledateformat,Java,Simpledateformat,我在解析这个日期时遇到了困难,最后的+0导致了一个问题,有人知道我的格式字符串有什么问题吗??如果我从日期字符串中删除+0,从格式字符串中删除Z,那么效果很好,不幸的是,对于我的应用程序来说,这不是一个选项 public class Main { /** * @param args */ public static void main(String[] args) { SimpleDateFormat dateFormater = new S

我在解析这个日期时遇到了困难,最后的+0导致了一个问题,有人知道我的格式字符串有什么问题吗??如果我从日期字符串中删除+0,从格式字符串中删除Z,那么效果很好,不幸的是,对于我的应用程序来说,这不是一个选项

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SimpleDateFormat dateFormater = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss zZ");
        try {
            Date d = dateFormater.parse("Sun, 04 Dec 2011 18:40:22 GMT+0");
            System.out.println(d.toLocaleString());
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

如果格式如此一致,则可以将
0:00
附加到日期字符串

String dateString = "Sun, 04 Dec 2011 18:40:22 GMT+0";
SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss z", Locale.ENGLISH);
Date date = sdf.parse(dateString + "0:00");
System.out.println(date);

(请注意,我修复了
SimpleDateFormat
构造,以明确指定用于解析星期日和月份名称的区域设置,否则它可能会在不使用英语作为默认区域设置的平台上失败;我还想知道您是否不需要
HH
而不是
kk
,但除此之外)一种方法是使用普通的字符串操作技术将字符串从您期望的表单转换为
SimpleDataFormat
能够理解的表单。您还没有明确说明可以接受的时区格式范围,但有一种可能是这样的:

private static Date parse(String dateString) throws ParseException
{
    final SimpleDateFormat dateFormat =
        new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss Z");
    dateString = dateString.replaceAll("(GMT[+-])(\\d)$", "$1\\0$2");
    dateString = dateString.replaceAll("(GMT[+-]\\d\\d)$", "$1:00");
    return dateFormat.parse(dateString);
}
这将支持GMT加上或减去一个或两位数的小时偏移量,此外还支持任何已由
SimpleDataFormat
支持的内容,例如
EST
GMT+1030

或者,如果您知道它将始终是GMT,那么您可以在格式化程序上设置时区,并忽略字符串中的时区:

private static Date parse(String dateString) throws ParseException
{
    final SimpleDateFormat dateFormat =
        new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    return dateFormat.parse(dateString);
}
您还可以分割差异。我注意到字符串中的时区格式与
TimeZone.getTimeZone()
所期望的格式相匹配。这是故意的吗?如果是这样,您可以从字符串中提取时区格式,事先将其传递给
dateFormat.setTimeZone
,然后在实际解析过程中忽略它:

private static Date parse(final String dateString) throws ParseException
{
    final SimpleDateFormat dateFormat =
        new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss");
    if(dateString.indexOf("GMT") > 0)
        dateFormat.setTimeZone
        (
            TimeZone.getTimeZone
                (dateString.substring(dateString.indexOf("GMT")))
        );
    return dateFormat.parse(dateString);
}
在这里,他们创建了一个自定义的日期格式