我們遇到了與工作的問題時,它試圖用SimpleDateFormat.parse(datestr)
呼叫時,datestr
包括時間正巧落在DST規則之內(即ParseException
發生與20140309020100
(yyyyMMddHHmmss
)的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;
}
}
這仍然有同樣的問題,因爲之前(ParseException
爲datetime
)
我曾嘗試將SimpleDateFormat
與TimeZone
關聯,但這樣做使得返回的日期偏移了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
作爲有效日期。
由於'20140309020100'不是您當地時區的有效日期/時間,您希望您的方法返回的「日期」值是多少? – GriffeyDog
@GriffeyDog - 我們希望該方法接受日期有效。僅僅因爲美國有DST,並不意味着它是無效的。但是,更改'TimeZone'也會將原始值更改爲包含偏移量。 – Ruminator
但是你正在返回一個'Date'對象,它表示自1970年1月1日00:00 UTC以來確切的毫秒數。如果您沒有提供有效的日期/時間,SimpleDateFormat#parse如何爲您提供這樣的Date對象?爲了將日期/時間字符串轉換爲Date,SimpleDateFormat需要一個時區來處理。如果您沒有提供它,它將使用您的默認語言環境的時區。在您的默認時區中,DST存在,並且您沒有爲這些考慮事項提供有效的日期/時間字符串。 – GriffeyDog