我试图通过解析json字符串在 Asynctask 中将字符串转换为日期。我引用了这个链接: How to convert "Mon Jun 18 00:00:00 IST 2012" to 18/06/2012?
//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 studio 中运行此代码时,它给出了以下异常:
04-14 12:35:53.363 22963-22963 / com.trial W / System.err: java.text.ParseException:Unparseable date:“Mon Jun 18 00:00:00 IST 2012“(抵消20)04-14 12:35:53.367 22963-22963 / com.trial W / System.err:at java.text.DateFormat.parse(DateFormat.java:579) 04-14 12:35:53.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:at 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:at 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)
但是当我通过创建简单的程序在 eclipse 中运行相同的代码时,它运行得非常好。
我很想知道,我不知道,为什么会这样。 所以,我在按钮点击的另一个活动中检查了相同的代码,但是没有用。
谢谢。任何帮助将不胜感激。
答案 0 :(得分: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使用。这是JSR-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");
}
答案 1 :(得分: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);