2014-03-12 45 views
0

我們遇到了與工作的問題時,它試圖用SimpleDateFormat.parse(datestr)呼叫時,datestr包括時間正巧落在DST規則之內(即ParseException發生與20140309020100yyyyMMddHHmmss的Java SimpleDateFormat.parse()錯誤是由於DST

我試圖建立的代碼來處理這個問題,並使它通用與我們所有的不同格式的工作:。

public static Date validDateTimestamp(String datetime, String [] formats) 
throws ParseException 
{ 
    for (int inx=0; inx < formats.length; inx++) 
    { 
     try { 
      return checkDateFormat(datetime, formats[inx]); 

     } 
     catch (ParseException e1) 
     { 
      // ignore this error, just try the next format 
     } 
    } 
// no good date returned using any format, throw an exception 
throw new ParseException("bad date: " + datetime, 0); 
} 
private static Date checkDateFormat(String datetime, String format) 
throws ParseException 
{ 
    SimpleDateFormat sdFormat = new SimpleDateFormat(format); 
    sdFormat.setLenient(false); 
    try { 
     return sdFormat.parse(datetime); 
    } catch (ParseException e) 
    { 
     throw e; 
    } 
} 

這仍然有同樣的問題,因爲之前(ParseExceptiondatetime

我曾嘗試將SimpleDateFormatTimeZone關聯,但這樣做使得返回的日期偏移了5個小時。

TimeZone utc = TimeZone.getTimeZone("UTC"); 
sdFormat.setTimeZone(utc); 

是否有使用SimpleDateFormat剖析的日期,以便它不會改變從什麼是通過在弦上的日期時間的方式,將確保日期是有效的,並且也將忽略夏令節省時間偏移(即不會拋出ParseException)?

我們不打算向項目中添加任何新庫,而是爲了使它與標準Java類一起工作。


基於從@GriffeyDog答案.....

Date對象從SimpleDateFormat.parse()調用返回的將是它在哪裏運行的時區。就我而言,EDT。即使設置SimpleDateFormat的時區也無濟於事 - 除了它將解析EDT的錯誤日期時間戳的事實以外;進入Date對象的內容將被轉換爲本地時間。由於改變了這個JVM設置是不是一個可行的選擇(共享服務器),而不是我修改了代碼如下:

  • 有兩種方法返回一個String
  • 修改checkDateFormat,這樣,而不是返回sdFormat.parse(datetime)它賦給一個Date對象
  • 設置一個新的格式,以規範的日期返回String - yyyyMMdd HH:mm:ss
  • 使用該格式返回日期的String - sdFormat.format(date)
  • 修改是做了一件與日期使用Oracle的to_date()函數,而不是依靠Date對象

這似乎做我們想要的轉換的Oracle調用。現在允許使用20140309020500作爲有效日期。

+2

由於'20140309020100'不是您當地時區的有效日期/時間,您希望您的方法返回的「日期」值是多少? – GriffeyDog

+0

@GriffeyDog - 我們希望該方法接受日期有效。僅僅因爲美國有DST,並不意味着它是無效的。但是,更改'TimeZone'也會將原始值更改爲包含偏移量。 – Ruminator

+0

但是你正在返回一個'Date'對象,它表示自1970年1月1日00:00 UTC以來確切的毫秒數。如果您沒有提供有效的日期/時間,SimpleDateFormat#parse如何爲您提供這樣的Date對象?爲了將日期/時間字符串轉換爲Date,SimpleDateFormat需要一個時區來處理。如果您沒有提供它,它將使用您的默認語言環境的時區。在您的默認時區中,DST存在,並且您沒有爲這些考慮事項提供有效的日期/時間字符串。 – GriffeyDog

回答

0

您正在返回一個Date對象,該對象表示自1970年1月1日00:00 UTC以來的精確毫秒數。如果您沒有提供有效的日期/時間,則SimpleDateFormat#parse不能爲您提供這樣的Date對象。爲了將日期/時間字符串轉換爲Date,需要使用時區SimpleDateFormat。如果您沒有提供它,它將使用您的默認語言環境的時區。在您的默認時區中,DST存在,並且您沒有爲這些考慮事項提供有效的日期/時間字符串。