2012-03-02 56 views
0

我寫了一個函數來將Date String(Thu,2012年3月1日13:57:06 -0600)轉換爲Date變量。 我依靠SimpleDateFormat進行轉換。轉換髮生,但最終的日期是「Thu Sep 01 11:00:06 GMT-08:00 2016」,我無法理解。我嘗試了不同的格式字符串仍然invain選項。任何幫助讚賞。謝謝。Java:使用時區變量將字符串轉換爲日期

我已經嘗試了格式字符串中的選項是: 1)E,DD MMM YYYY HH:MM:SSŽ 2)EEE,DD MMM YYYY HH:MM:SS ZZZZ

private Date Convert_To_Date() { 

     Date dt = null; 

     String str = "Thu, 1 Mar 2012 13:57:06 -0600"; 
     SimpleDateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy HH:MM:ss Z"); 

     try { 
      dt = formatter.parse(str); 
     } 
     catch (ParseException pe) { 
      System.out.println(pe.getMessage()); 
     } 

     //String strDt = dt.toString(); 
     System.out.println(dt); 

     return dt; 
    } 

回答

3

我認爲問題只是你用「M」而不用「m」來表示分鐘。這對我來說工作得很好:

import java.text.*; 
import java.util.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     String text = "Thu, 1 Mar 2012 13:57:06 -0600"; 
     // Note the explicit locale. Let's not leave it as the system default :) 
     DateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z", 
                Locale.US); 

     Date dt = formatter.parse(text); 
     System.out.println(dt); 
    } 
} 

(如sgmorrison指出,你可以使用d代替dd過,這將是您的格式的更準確的描述 - 但dd作品在這種情況下解析。)

2

在你的日期格式字符串一對夫婦的小的bug:

您的匹配在小時分應該是「毫米」,而不是「MM」(這符合今年月)模式。有關詳細信息,請參見SimpleDateFormat。 「

另外,您在月份中匹配天數的模式應該是」d「而不是」dd「,因爲」模式字母的數量是最小位數,而較短數字是零填充到此量。對於解析,模式字母的數量將被忽略,除非需要分隔兩個相鄰的字段。「

0

TL;博士

ZonedDateTime.parse( 
    "Thu, 1 Mar 2012 13:57:06 -0600" , // Input complies with RFC 1123 & RFC 822. 
    DateTimeFormatter.RFC_1123_DATE_TIME // Hard-coded to English locale. 
).toString() 

2012-03-01T13:57:06-06:00

java.time

現代的方法使用java的。時間取代麻煩的舊的遺留日期 - 時間類的類。

RFC 1123/RFC 822

你輸入的字符串恰好符合RFC 1123/RFC 822java.time.DateTimeFormatter類爲該格式定義了一個常數DateTimeFormatter.RFC_1123_DATE_TIME

String input = "Thu, 1 Mar 2012 13:57:06 -0600" ; 
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ; 
ZonedDateTime zdt = ZonedDateTime.parse(input , f) ; 

2012-03-01T13:57:06-06:00

這些RFC是老了。該格式現在由ISO 8601標準過時。舊格式很糟糕:假設英語,容忍各種各樣的內容,並且很難解析。

大多數現代協議和標準都使用ISO 8601格式來交換日期時間值作爲文本。這個標準定義的格式是實用的,即使在不同的文化中也是明確的,易於被機器解析,並且易於人類讀取以進行調試/記錄。

java.time類在解析/生成字符串時默認使用ISO 8601格式,如上例所示。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目,現在在maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

隨着JDBC driverJDBC 4.2或更高版本相符時,你可以交換java.time直接對象與數據庫。無需字符串或java.sql。*類。

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

相關問題