2017-06-28 88 views
1

我想通過解析字符串日期得到java.util.Date對象:「2017-06-28 08:30 AM」。這個解析用在我的Android應用程序中。這在許多Android版本中沒有任何解析異常。像7.0,4.4.2和5.1一樣。但是這在Android 6.0中不起作用。Java:DATE_EXCEPTION無法解析的日期:「2017-06-28 08:30 AM」(在偏移量17)

這是我的錯誤日誌和SimpleDateFormat

W/System.err: java.text.ParseException: Unparseable date: "2017-06-28 08:30 AM" (at offset 17) 
at java.text.DateFormat.parse(DateFormat.java:579) 
at biz.spsolutions.peopleedge.RosterClockInActivity.setData(RosterClockInActivity.java:531) 
at biz.spsolutions.peopleedge.RosterClockInActivity.onCreate(RosterClockInActivity.java:391) 
at android.app.Activity.performCreate(Activity.java:6877) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3208) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3351) 
at android.app.ActivityThread.access$1100(ActivityThread.java:222) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1796) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:158) 
at android.app.ActivityThread.main(ActivityThread.java:7230) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

,這是我SimpleDateFormat

SimpleDateFormat currentFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a") 

而且我已經在這個格式也試過,

SimpleDateFormat currentFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm aaa") 

哪有我處理這個異常?有什麼想法?

+1

試試這個'2017年6月28日08:30 am' –

+2

@Barrier檢查http://www.brightec.co.uk/ideas/android-marshmallow-and-simpledateformat是否有幫助。 – gvmani

+0

@M D:好的,我會盡力通知你 – Barrier

回答

6

tl; dr

使用現代java.time類時沒有問題。

LocalDateTime.parse( 
    "2017-06-28 08:30 AM" , 
    DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a" , Locale.US) 
) 

2017-06-28T08:30

使用java.time

您正在使用的是現在傳統麻煩舊日期時間類,由java.time取代類。對於Android,請參閱下面的最後一項。

請注意,我指定Locale.US作爲我的格式化程序的一部分。區域設置決定了用於確定諸如大寫等問題的文化規範。我懷疑你的JVM的當前默認值可能設置爲一個期望「AM/PM」爲小寫的語言環境。始終指定預期的/期望的區域設置,而不是隱式地依賴當前的默認區域設置,該設置可以隨時由應用程序中的任何代碼進行更改。欲瞭解更多信息,請參閱other Question

String input = "2017-06-28 08:30 AM" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a" , Locale.US) ; 
LocalDateTime ldt = LocalDateTime.parse(input , f) ; 

看到這個code run live at IdeOne.com

ldt.toString():2017-06-28T08:30


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

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

從何處獲取java.time類?

+1

@DawoodibnKareem(a)請注意,我在答案中顯示了'Locale'的使用。 (b)沒有理由使用舊的'Date' /'Calendar' /'SimpleDateFormat'類的血腥糟糕的混亂。我聲稱避免這些類是每個這樣的問題的正確解決方案。 (c)我將補充一個具體的提到區域是造成問題的可能原因。 –

+1

@DawoodibnKareem,我明白你的觀點。我也同意你的看法,OP的問題很可能與地區有關。答案* does *爲輸入字符串提供了正確的語言環境,從而解決了問題。以另一種方式解決問題而不是預期的問題在Stack Overflow方面很受歡迎,並且幫助成千上萬的用戶,往往比他們預期的更好。雖然這可能不是要求的答案,但它仍然可能是OP想要的答案。 –

+2

@ OleV.V。你是對的。我在此收回我的反對意見,並且實行當之無愧的快樂。 –

相關問題