2017-04-14 181 views
-3

我试图通过解析json字符串来将字符串转换为日期Asynctask。我提到这个链接: How to convert "Mon Jun 18 00:00:00 IST 2012" to 18/06/2012?将字符串转换为IST日期

//String dateStr = "Mon Jun 18 00:00:00 IST 2012"; 

changedDate = jsonObjectMain.getString("date"); 
DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy"); 
Date date = (Date)formatter.parse(changedDate); 
System.out.println(date);   

Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
String formatedDate = cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" +   cal.get(Calendar.YEAR); 
System.out.println("formatedDate : " + formatedDate); 

当我运行在Android的工作室这个代码,它给了我下面的例外:

一十二月4日至14日:35:53.363 22963-22963/COM .trial W/System.err: java.text.ParseException:Unparseable date:“Mon Jun 18 00:00:00 IST 2012”(at offset 20)04-14 12:35:53.367 22963-22963/com。试用 W/System.err:在java.text.DateFormat.parse(DateFormat.java:579) 04-14 12:35:5 3.367 22963-22963/com.trial W/System.err:at com.trial.Activity.StartActivity.onClick(StartActivity.java:124) 04-14 12:35:53.367 22963-22963/com.trial W/System.err:at android.view.View.performClick(View.java:5210)04-14 12:35:53.367 22963-22963/com.trial W/System.err:at android.view.View $ PerformClick.run(View.java:21183)04-14 12:35:53.367 22963-22963/com.trial W/System.err:at android.os.Handler.handleCallback(Handler.java:739)04- 14 12:35:53.367 22963-22963/com.trial W/System.err:at android.os.Handler.dispatchMessage(Handler.java:95)04-14 12:35:53.367 22963-22963/com .trial W/System.err:在 android.os.Looper.loop(Looper.java:148) 04-14 12:35:53.367 22963-22963/com.trial W/System.err:at android.app.ActivityThread.main(ActivityThread.java:5438)04-14 12:35:53.367 22963-22963 /com.trial W/System.err: java.lang.reflect.Method.invoke(Native Method)04-14 12:35:53.367 22963-22963/com.trialW/System.err:at com。 android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:762) 04-14 12:35:53.367 22963-22963/com.trial W/System.err:at com.android.internal.os。 ZygoteInit.main(ZygoteInit.java:652)

但是,当我在蚀运行相同的代码通过创建简单的程序,它运行得非常好。

我很想知道,我不知道,为什么会发生这种情况。 所以,我在另一个按钮点击活动检查相同的代码,但没有工作

谢谢。任何帮助将不胜感激。

+0

转换IST字符串是相当棘手。我相信你得到的错误是因为'IST'。我可否知道该时区是修复IST还是动态? –

+0

我从这个合成器获得json的字符串“Mon Jun 18 00:00:00 IST 2012”。所以我不确定时区是否修复。 –

+1

如果可以,请远离三个字母的时区缩写。 IST可能意味着印度标准时间,爱尔兰标准时间或以色列标准时间。更好地使用“亚洲/加尔各答”,“欧洲/都柏林”或“亚洲/ Tel_Aviv”。 –

回答

0

尝试改变格式 “EEE MMM DD HH:MM:SS YYYY”,并设置IST的timeZone

changedDate = changedDate.replace("IST ", ""); 
SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyy"); 
TimeZone timeZone=TimeZone.getTimeZone("IST"); 
formatter.setTimeZone(timeZone); 

Date date = (Date)formatter.parse(changedDate); 
+0

我也试过,但没有奏效。 –

+0

更新的答案正常工作。 – Pehlaj

+1

是的,这个作品很棒!谢谢。 –

1

我知道在Android上使用的较新的java.time类需要一个外部的依赖(ThreeTenABP),和此外,你现在有一个工作解决方案。对于其他人一起,阅读或者可以使用Java 8或更高版本,很高兴与库的依赖,在这里是如何做到:

String dateStr = "Mon Jun 18 00:00:00 IST 2012"; 

DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss z uuuu", Locale.ENGLISH); 
LocalDate date = LocalDate.parse(dateStr, inputFormat); 

String formattedDate = date.format(DateTimeFormatter.ofPattern("dd/MM/uuuu")); 

System.out.println(formattedDate); 

如果你事先知道该字符串包含正确的日,月,年,你可以完全忽略时区。

链接:java.time类(其中LocalDate只是其中的一个很有帮助)可以在Android上使用,通过the ThreeTenABP。这是JST-310和Android Backport的ABP的三倍。

PS。如果您希望您的输入字符串的一些进一步的验证,可以例如检查时间部分等于一天中的特定时间区的开始:

ZonedDateTime zdt = ZonedDateTime.parse(dateStr, inputFormat); 
if (! zdt.equals(zdt.toLocalDate().atStartOfDay(zdt.getZone()))) { 
    throw new IllegalArgumentException("Input date was not at midnight"); 
}