SimpleDateFormat 不解析 IST 日期

问题描述

我正在尝试解析这个日期:2021 年 7 月 5 日星期一 23:19:58 IST

String date = "Mon,05 Jul 2021 23:19:58 IST";
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE,dd MMM yyyy HH:mm:ss z",Locale.getDefault());
dateFormat.parse(date);

但我收到此错误java.text.ParseException: Unparseable date: "Mon,05 Jul 2021 23:19:58 IST"

当我从格式中省略小写字母 z 时,我没有得到异常,但日期不在正确的时区中。我尝试执行以下操作:

dateFormat.setTimeZone(TimeZone.getTimeZone("IST"));

但是日期仍然显示在未来,这是不正确的。我怎样才能正确解析这个日期?谢谢。

解决方法

不要使用 Date 或 SimpleDateTime。使用 java.time 包中的类。

java.lang.NullPointerException: 
  at [myapp].OneDriveProvider$4.success (OneDriveProvider.java:183)
  at [myapp].OneDriveProvider$4.success (OneDriveProvider.java:176)
  at com.onedrive.sdk.concurrency.DefaultExecutors$1.run (DefaultExecutors.java:88)
  at com.onedrive.sdk.concurrency.SynchronousExecutor$1.onPostExecute (SynchronousExecutor.java:54)
  at com.onedrive.sdk.concurrency.SynchronousExecutor$1.onPostExecute (SynchronousExecutor.java:46)
  at android.os.AsyncTask.finish (AsyncTask.java:755)
  at android.os.AsyncTask.access$900 (AsyncTask.java:192)
  at android.os.AsyncTask$InternalHandler.handleMessage (AsyncTask.java:772)
  at android.os.Handler.dispatchMessage (Handler.java:107)
  at android.os.Looper.loop (Looper.java:214)
  at android.app.ActivityThread.main (ActivityThread.java:7397)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:492)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:935)

印刷品

String date = "Mon,05 Jul 2021 23:19:58 IST";

DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(
        "EEE,dd MMM yyyy HH:mm:ss z",Locale.US);
ZonedDateTime zdt = ZonedDateTime.parse(date,dateFormat);
System.out.println(zdt.format(dateFormat));

编辑

仔细阅读 Mon,05 Jul 2021 23:19:58 GMT 包后,我发现 java.time 包含 ZoneId.SHORT_IDS。因此,如果您执行以下操作:

IST=Asia/Kolkata

打印

ZonedDateTime zdt = ZonedDateTime.parse(date,dateFormat)
              .withZoneSameLocal(ZoneId.of("Asia/Kolkata"));
System.out.println(zdt.format(dateFormat));