【问题标题】:DateTime with Timezone to another format带时区的日期时间转换为另一种格式
【发布时间】:2019-08-07 16:30:10
【问题描述】:

我在yyyy-mm-ddThh:mm:ss.nnnnnn+|-hh:mm 中有一个日期时间,我想将它转换成这种格式MMMM-yyyy 我已经使用 java.time API 成功地做到了这一点,但无法使用 SimpleDateTimeFormatter 做到这一点。因为 java.time 只支持 android O 以后,所以我仍然需要支持旧设备。我当前失败并给出异常的代码是

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                ZonedDateTime datetime = ZonedDateTime.parse(argDate);
                DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("MMMM-yyyy");
                String formatDateTime = datetime.format(targetFormatter);
                return formatDateTime;
    } else{ 
        try {
        DateFormat originalFormat = new SimpleDateFormat("yyyy-mm-ddThh:mm:ss.nnnnnn+|-hh:mm", Locale.ENGLISH);
        DateFormat targetFormat = new SimpleDateFormat("MMMM-yyyy");
        Date date = originalFormat.parse(argDate);
        String formattedDate = targetFormat.format(date);  // 20120821
        return formattedDate;
    }catch(Exception ex){
        ex.printStackTrace();
    }
    }

例外是

W/System.err: java.lang.IllegalArgumentException: 非法模式 字符'T' 2019-08-07 21:53:24.445 14123-14123/com.chat W / System.err:在 java.text.SimpleDateFormat.compile(SimpleDateFormat.java:873) 2019-08-07 21:53:24.445 14123-14123/com.chat W/System.err:
在 java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:687) 2019-08-07 21:53:24.445 14123-14123/com.chat W/System.err:
在 java.text.SimpleDateFormat.(SimpleDateFormat.java:658) 2019-08-07 21:53:24.445 14123-14123/com.chat W/System.err:
在 .ui.ContactDetailsActivity.formatDate(ContactDetailsActivity.java:652) 2019-08-07 21:53:24.445 14123-14123/com.chat W/System.err:
在 .ui.ContactDetailsActivity.fillUserCompanyDetails(ContactDetailsActivity.java:620) 2019-08-07 21:53:24.445 14123-14123/com.chat W/System.err:
在 .ui.ContactDetailsActivity.showUIFromData(ContactDetailsActivity.java:562) 2019-08-07 21:53:24.445 14123-14123/com..chat W/System.err:
在 .ui.ContactDetailsActivity.access$300(ContactDetailsActivity.java:77) 2019-08-07 21:53:24.445 14123-14123/com.chat W/System.err:
在 .ui.ContactDetailsActivity$6.onResponse(ContactDetailsActivity.java:544) 2019-08-07 21:53:24.446 14123-14123/com.chat W/System.err:
在 retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68) 2019-08-07 21:53:24.446 14123-14123/com.chat W/System.err:
在 android.os.Handler.handleCallback(Handler.java:873) 2019-08-07 21:53:24.446 14123-14123/com.chat W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99) 2019-08-07 21:53:24.446 14123-14123/com.chat W/System.err: at android.os.Looper.loop(Looper.java:193) 2019-08-07 21:53:24.446 14123-14123/com.chat W/System.err:在 android.app.ActivityThread.main(ActivityThread.java:6718) 2019-08-07 21:53:24.446 14123-14123/com.chat W/System.err: at java.lang.reflect.Method.invoke(Native Method) 2019-08-07 21:53:24.446 14123-14123/com.chat W/System.err:在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 2019-08-07 21:53:24.446 14123-14123/com.chat W/System.err:
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

有人可以帮我解决这个问题吗?我想我当时的格式不正确2019-08-06T11:52:49:416472+5:30 我采用了 E8601DZw.d 格式,它被描述为yyyy-mm-ddThh:mm:ss.nnnnnn+|-hh:mm here

【问题讨论】:

标签: java android date datetime


【解决方案1】:

ThreeTenABP

由于您使用 java.time 找到了一个可行的解决方案,并且由于 SimpleDateFormat 造成了麻烦(不仅对您而言:它臭名昭著很麻烦),我建议您使用java.time.在 ThreeTenABP 项目中已经对 Android 进行了适配。请参阅底部的链接。

严格来说,只有 java.time 的中心和最常用的部分被向后移植。但是,这涵盖了至少 99% 的使用 java.time 的程序中使用的所有内容,我相信您拥有的解决方案也将在 backport 上保持不变。当我说 unchanged 时,需要进行一项更改:您必须从 org.threeten.bp 导入日期和时间类以及子包。

如果您坚持不使用 backport,我还会提供有关解析 ISO 8601 格式的问题的链接。 ISO 8601 是一个国际标准,这是您所拥有的格式。但是请注意:SimpleDateFormat 无法正确解析秒的 6 位小数。它只支持毫秒,正好是三位小数(不是 2,不是 4,不是 6)。

链接

【讨论】:

  • “yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX”日期格式。这个其实就是。我几个小时前修好了这个。但这是我应该使用的格式
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2015-06-12
  • 2014-04-06
相关资源
最近更新 更多