簡體   English   中英

Java SimpleDateFormat.parse()由於DST錯誤

[英]Java SimpleDateFormat.parse() Error due to DST

datestr包含恰好在DST規則之內的時間時SimpleDateFormat.parse(datestr)20140309020100yyyyMMddHHmmss發生了ParseException SimpleDateFormat.parse(datestr)當它嘗試使用SimpleDateFormat.parse(datestr)調用時,我們遇到了一個問題。

我正在嘗試構建代碼來處理此問題,並使其通用以與我們所有不同的格式一起使用:

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

這仍然具有與以前相同的問題( datetime ParseException )。

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

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

有沒有一種方法可以使用SimpleDateFormat來解析日期,以使它不會更改String上傳遞的日期時間,將確保該日期有效,並且還將忽略夏時制偏移量(即,“拋出ParseException )?

我們不打算在項目中添加任何新庫,而是希望它與標准Java類一起使用。


根據@GriffeyDog的回答.....

SimpleDateFormat.parse()調用返回的Date對象將在其運行的時區中。 就我而言,EDT。 即使設置SimpleDateFormat的時區也無濟於事-除了它會解析對於EDT不好的datetimestamp以外的事實。 Date對象中將獲取的內容將轉換為本地時間。 由於為此更改JVM設置不是一個可行的選擇(共享服務器),因此我如下修改了代碼:

  • 讓兩個方法都返回一個String
  • 修改checkDateFormat以便將其分配給Date對象,而不是返回sdFormat.parse(datetime)
  • 設置新格式以標准化日期返回String yyyyMMdd HH:mm:ss
  • 使用該格式返回日期的String sdFormat.format(date)
  • 修改使用日期執行某些操作的Oracle調用以使用Oracle的to_date()函數,而不是依賴於Date對象的轉換

這似乎可以滿足我們的要求。 現在將允許20140309020500作為有效日期。

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

暫無
暫無

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

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