【问题标题】:Format Date from yyyy-MM-dd'T'hh:mm:ss.SSS'Z'" to Sat 20th May, 06:00 [duplicate]格式日期从 yyyy-MM-dd'T'hh:mm:ss.SSS'Z'" 到 5 月 20 日星期六 06:00 [重复]
【发布时间】:2017-05-21 16:13:30
【问题描述】:

我有一个像这样作为字符串的日期

2017-05-20T18:00:56Z

我想将其转换为 5 月 20 日星期六 06:00 之类的内容

我该怎么做?我尝试了下面的代码,但这似乎不起作用,同样有很多类似的帖子,但对我不起作用

        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'");
        try {
            Date myDate = myFormat.parse(actorList.get(position).getPublishedat());
            holder.publishedat.setText(myDate.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }

【问题讨论】:

  • 您在这里只解析一个日期,那么在尝试格式化新日期字符串时会出现什么错误?
  • 嗨,我没有收到任何错误。只是我想将我的 JSON 字符串日期“yyyy-MM-dd'T'hh:mm:ss.SSS'Z'”格式化为“Sat 20th May, 06:00”
  • 好吧,那你为什么认为myDate.toString() 会找出你想要的格式?
  • 请具体说明您咨询过哪些类似的帖子,以及为什么它们不适合您。这将帮助我们更好地了解您的问题,并且更容易引导您朝着正确的方向前进,
  • @user45678 在发布前搜索 Stack Overflow。始终假设有关常见主题的基本问题已被提出并得到解答。

标签: java android datetime


【解决方案1】:

此解决方案跳过旧的 SimpleDateFormatDate,而是使用 JSR-310 中描述的较新类。它们通常对程序员更友好。

    String formattedDate = Instant.parse(publishedAt)
            .atOffset(ZoneOffset.UTC)
            .format(DateTimeFormatter.ofPattern("EEE dd'th' MMM, hh:mm", Locale.ENGLISH));

打印出来

Sat 20th May, 06:00

请注意,我们现在已经丢失了时间是上午还是下午。 06:00 可能表示早上 6 点或下午 6 点。您可能需要再次考虑这是否是您想要的。如果没有,只需根据您的需要修改代码中的格式模式字符串,并询问是否有疑问。假设这是您想要的,我正在以 UTC 时区打印时间。

你还会注意到我没有给出解析字符串的明确格式。这是因为您的字符串符合 ISO 8601,这是 JSR-310 类“理解”为它们的默认值。

当日期是 5 月 20 日时,这一切都非常好。第二天呢?我们不想要21th May,而是21st。这就是 JSR-310 类显示其真正优势之一的地方:获取月份中的某一天既简单又安全,因此我们可以检查它是一个月的第一天、第二天还是第 21 天:

    OffsetDateTime dateTime = Instant.parse(publishedAt).atOffset(ZoneOffset.UTC);
    String numberSuffix = "th";
    if (dateTime.getDayOfMonth() == 1 || dateTime.getDayOfMonth() == 21
            || dateTime.getDayOfMonth() == 31) {
        // print for example 01st or 21st
        numberSuffix = "st";
    } else if (dateTime.getDayOfMonth() == 2 || dateTime.getDayOfMonth() == 22) {
        numberSuffix = "nd";
    } else if (dateTime.getDayOfMonth() == 3 || dateTime.getDayOfMonth() == 23) {
        numberSuffix = "rd";
    }
    String formatPattern = "EEE dd'" + numberSuffix + "' MMM, hh:mm";
    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern(formatPattern, Locale.ENGLISH);

有了这个改变,我们也可以得到结果

Sun 21st May, 06:00

要在 Android 上使用 JSR-310 类,您需要获取 ThreeTenABP。我在下面提供了几个链接。对于使用 Java 8 或更高版本的任何人,它们都内置在 java.time 包中。

链接

【讨论】:

    【解决方案2】:

    请这样尝试

    SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'");
    String displayformat="EEE dd MMM, hh:mm";
    SimpleDateFormat destFormat=new SimpleDateFormat(displayformat);
    
            try {
                Date myDate = myFormat.parse(actorList.get(position).getPublishedat());
                holder.publishedat.setText(destFormat.format(myDate));
            } catch (ParseException e) {
                e.printStackTrace();
            }
    

    希望这对您有所帮助。如果您有任何问题可以提出。

    【讨论】:

    • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat 现在是 legacy,被 java.time 类取代。在ThreeTen-Backport 项目中,大部分 java.time 功能都向后移植到 Java 6 和 7。在ThreeTenABP 项目中进一步适用于Android。
    • 感谢您通知我,我会检查一下
    猜你喜欢
    • 2012-10-08
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多