2016-05-17 80 views
-2

我想將當前時間和日期解析爲這種簡單的日期格式。Java中的Unparsable日期:SimpleDateFormat的基本日曆實例分析問題

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy-kk:mm"); 
Date datetoday = sdf.parse(Calendar.getInstance().getTime().toString()); 

但是,我明白了。

java.text.ParseException:無法解析的日期: 「週二5月17日15時28分36秒CDT 2016」

我仍然能夠解析字符串一樣:10/10/1991年至1912年:00但是當給定日曆實例,它會爆炸。我真的應該已經使用JodaTime從開始。

我該如何獲得當前時間,直接進入SimpleDateFormat?據我瞭解,SimpleDateFormat將接收字符串,並在其能夠解析它時將其轉換爲日期。解析將會看到,Tue會進入SDF中的ddd區域,並且如果我將進入MMM有一個簡單的日期格式。我不。我有MM,所以它炸燬了。我可以在輸入中輸入一個M/d/yyyy,所以我最終給出了M,同時請求了MM,這仍然有效。

我是否應該放棄一切,並與JodaTime或有一兩行我失蹤?

+4

我不明白。如果你有一個'Calendar'實例,你可以直接從它得到'Date'。爲什麼你需要將它轉換爲一個字符串並解析該字符串? –

+1

JodaTime?不,你應該使用JDK 8和java.time包。 – duffymo

+0

我不清楚。我有一個日期遵循MM-dd-yyyy的格式,我想將它與當前日期進行比較,而日曆實例不遵循該格式,因此無法進行比較。 – Jayizzle

回答

1

這是你如何獲得表示爲一個Java Date對象當前日期:

Date date = new Date(); 

這是你如何獲得當前日期爲格式的字符串:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy-kk:mm"); 
String formattedDateString = sdf.format(new Date()); 

然後,您可以進一步分析它回到日期:

Date date = sdf.parse(formattedDateString); 

但這樣做沒有意義,因爲你alr伊迪有日期,當你做了.format(...)調用,只有在你的情況,你所用

Calendar.getInstance().getTime() 

如果你想解析,它通常具有相同的結果

new Date() 

字符串轉換爲日期,那麼字符串需要與SimpleDateFormat構造函數中指定的格式匹配。您正在使用的Date的toString()方法以特定的格式返回一個字符串,與您的示例中的格式不匹配,這就是您得到ParseException錯誤的原因。

0

字符串!=日期 - 時間

不要混淆一個日期時間對象與表示其值的String。

您應該儘可能使用對象。生成一個字符串僅用於呈現給用戶。使用字符串與其他軟件交換數據時,請僅使用ISO 8601格式。

java.time

的問題和接受的答案都使用麻煩的舊的遺留日期時間類,現在由java.time類取代。

您的輸入格式不是標準的,而且容易混淆。這是-12:00結束時區或時間?我會猜測一天的時間。這個猜測意味着輸入缺少任何關於從UTC或時區偏移的指示。所以我們解析爲LocalDateTime對象。

String input = "5/5/1991-12:00" 
DateTimeFormatter f = DateTimeFormatter.ofPattern("M/d/uuuu-HH:mm"); 
LocalDateTime ldt = LocalDateTime.format(input , f); 

ldt.toString():1991-05-05T12:00

LocalDateTime對象故意缺乏任何offset-from-UTC或時區。這意味着它不是而是代表了時間軸上的一個時刻,只是關於可能時刻的一個粗略想法。你必須指定一個時區來賦予其含義。

如果您的建議上下文表明該輸入是爲了在UTC,應用不斷ZoneOffset.UTC得到一個OffsetDateTime

OffsetDateTime odt = ldt.atOffset (ZoneOffset.UTC); 

odt.toString():1991-05-05T12:00Z

在標準ISO 8601字符串的結尾的Z是短期的和ZuluUTC

另一方面,如果上下文指示特定時區,請應用ZoneId以獲得ZonedDateTime。什麼時區用於您的示例輸入字符串?你是指新西蘭奧克蘭中午,巴黎中午中午或加拿大魁北克蒙特利爾中午?

ZoneId z = ZoneId.of ("America/Montreal"); 
ZonedDateTime zdt = ldt.atZone (z); 

zdt.toString():1991-05-05T12:00-04:00 [美國/蒙特利爾]

關於java.time

java.time框架內置到Java 8和更高版本。這些課程取代了麻煩的舊日期時間課程,如java.util.Date,.Calendar,& java.text.SimpleDateFormat

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

大部分的java.time功能後移植到Java 6 和ThreeTenABP還適於Android(見How to use…)。

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