解析“2020-03-30T07:37:02.282+01:00”类型的日期时出现日期格式化问题,我必须在今天上午 12:30 格式化表格

Posted

技术标签:

【中文标题】解析“2020-03-30T07:37:02.282+01:00”类型的日期时出现日期格式化问题,我必须在今天上午 12:30 格式化表格【英文标题】:Date Formatter Issue when parsing date of type "2020-03-30T07:37:02.282+01:00" i have to format in the form today at 12:30 am 【发布时间】:2020-04-01 06:30:49 【问题描述】:

格式化“2020-03-30T07:37:02.282+01:00”类型的日期和时间时遇到问题 我正在以这两种格式从我的服务器获取日期“2020-03-30T07:37:02.282+01:00”和 “2020-03-30T05:44:02.397Z”我认为我使用了正确的时间,但在解析时不确定我得到了日期类型“2020-03-30T07:37:02.282+01:00”的可解析预期但是我能够解析“2020-03-30T05:44:02.397Z”类型的日期。我用于格式化日期的代码是

    fun formatToYesterdayOrToday(responseTime: String?): String? 
    val dateTime: Date =
        SimpleDateFormat(
            "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'",
            Locale.getDefault()
        ).parse(responseTime)
    val calendar: Calendar =
        Calendar.getInstance()
    calendar.time = dateTime
    val today: Calendar =
        Calendar.getInstance()
    val yesterday: Calendar =
        Calendar.getInstance()
    yesterday.add(Calendar.DATE, -1)
    val timeFormatter: DateFormat =
        SimpleDateFormat("hh:mma", Locale.getDefault())
    val dateFormatter: DateFormat =
        SimpleDateFormat("dd-MM-yyyy", Locale.getDefault())
    return if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) &&
        calendar.get(Calendar.DAY_OF_MONTH) == today.get(Calendar.DAY_OF_MONTH) &&
        calendar.get(Calendar.MONTH) == today.get(Calendar.MONTH)
    ) 
        "Updated: " + setAmPmToLowercase(timeFormatter.format(dateTime)) + " today"
     else if (calendar.get(Calendar.YEAR) == yesterday.get(Calendar.YEAR) &&
        calendar.get(Calendar.DAY_OF_MONTH) == yesterday.get(Calendar.DAY_OF_MONTH) &&
        calendar.get(Calendar.MONTH) == yesterday.get(Calendar.MONTH)
    ) 
        "Updated: " + setAmPmToLowercase(timeFormatter.format(dateTime) + " yesterday")
     else 
        "Updated on: " + dateFormatter.format(dateTime) + " at " + setAmPmToLowercase(
            timeFormatter.format(dateTime)
        )
    

谁能帮我解决我的代码有什么问题?

【问题讨论】:

我建议您不要使用SimpleDateFormatDateCalendar。所有这些类都设计得很糟糕并且已经过时了,尤其是第一个类是出了名的麻烦。而是使用OffsetDateTimeDateTimeFormatter 和来自java.time, the modern Java date and time API 的其他类。 您可能还想用您使用的语言标记您的问题。 【参考方案1】:

这两个字符串 — 2020-03-30T07:37:02.282+01:002020-03-30T05:44:02.397Z — 具有相同的格式。格式为 ISO 8601(请参阅底部的链接)。在 ISO 8601 中,与 UTC(或 GMT)的偏移量可以以 Z 表示零或例如 +01:00 表示 1 小时 0 分钟(存在更多变体)。

您应该更喜欢使用现代 Java 日期和时间 API java.time 来处理日期和时间。 java.time.OffsetDateTime 也将 ISO 8601 解析为其默认值,也就是说,没有任何显式格式化程序。所以我们不需要考虑格式模式字符串。在 Java 中:

    OffsetDateTime dateTime
            = OffsetDateTime.parse("2020-03-30T07:37:02.282+01:00");
    System.out.println(dateTime);
    dateTime = OffsetDateTime.parse("2020-03-30T05:44:02.397Z");
    System.out.println(dateTime);

输出:

2020-03-30T07:37:02.282+01:00
2020-03-30T05:44:02.397Z

您注意到OffsetDateTime.toString()(在我们打印对象时隐式调用)也在返回 ISO 8601 格式。

即使我们需要为格式化程序编写格式模式字符串,您也应该永远Z 硬编码为文字(通过将其放在单引号中)。正如我所说,Z 是与 UTC 的偏移量,需要按原样进行解析,否则您将无法解析字符串,或者更糟糕的是,您可能会因此而得到不正确的结果。当您说您能够解析 2020-03-30T05:44:02.397Z 时,您很可能得到了错误的结果。

链接

Oracle tutorial: Date Time 解释如何使用 java.time。 Wikipedia article: ISO 8601

【讨论】:

以上是关于解析“2020-03-30T07:37:02.282+01:00”类型的日期时出现日期格式化问题,我必须在今天上午 12:30 格式化表格的主要内容,如果未能解决你的问题,请参考以下文章

云解析DNS如何实现智能解析?

全民解析vip视频哪个好

mybatis源码配置文件解析之五:解析mappers标签(解析class属性)

什么是DNS域名解析,怎样解析?

DNS域名解析服务(正向解析反向解析)

DEX文件解析--6dex文件字段和方法定义解析