使用 IST 将字符串转换为日期

Convert string to date with IST

我正在尝试通过解析 json 字符串将字符串转换为 Asynctask 中的日期。我提到了这个 link: 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" (at offset 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 中使用相同的代码时,它 运行 非常好。

我很奇怪,我不知道,为什么会这样。 所以,我在另一个 Activity 中检查了相同的代码,但 没有用

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

尝试将格式更改为 "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);

我知道在 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);

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

Link:java.time 类(其中 LocalDate 只是众多帮助之一)可以用于 Android 到 the ThreeTenABP.这是 JSR-310 的 ThreeTen 和 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");
}