[英]Java SimpleDateFormat.parse() Error due to DST
當datestr
包含恰好在DST規則之內的時間時SimpleDateFormat.parse(datestr)
, 20140309020100
( yyyyMMddHHmmss
發生了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類一起使用。
從SimpleDateFormat.parse()
調用返回的Date
對象將在其運行的時區中。 就我而言,EDT。 即使設置SimpleDateFormat
的時區也無濟於事-除了它會解析對於EDT不好的datetimestamp以外的事實。 Date對象中將獲取的內容將轉換為本地時間。 由於為此更改JVM設置不是一個可行的選擇(共享服務器),因此我如下修改了代碼:
String
值 checkDateFormat
以便將其分配給Date
對象,而不是返回sdFormat.parse(datetime)
String
yyyyMMdd HH:mm:ss
String
sdFormat.format(date)
to_date()
函數,而不是依賴於Date
對象的轉換 這似乎可以滿足我們的要求。 現在將允許20140309020500
作為有效日期。
您將返回一個Date
對象,該對象表示自1970年1月1日00:00 UTC以來的確切毫秒數。 如果您未向其提供有效的日期/時間,則SimpleDateFormat#parse
無法為您提供這樣的Date
對象。 為了將您的日期/時間字符串轉換為Date
, SimpleDateFormat
需要一個時區。 如果您未提供默認語言環境的時區,它將使用您的默認語言環境。 並且在您的默認時區中,DST存在,並且您沒有為這些注意事項提供有效的日期/時間字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.