簡體   English   中英

SimpleDateFormat時區解析

[英]SimpleDateFormat timezone parsing

我在解析此日期時遇到了麻煩,最后導致了+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();
        }
    }
}

一種方法是使用常規的字符串處理技術將字符串從所需的格式轉換為SimpleDateFormat可以理解的格式。 您尚未確切說明可接受的時區格式范圍,但是一種可能是這樣的:

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);
}

除了仍支持SimpleDateFormat已支持的任何功能(例如ESTGMT+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);
}

如果格式一致,則可以在日期字符串后加上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 ,但是那邊)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM