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

我在格式化“ 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)
        )
    }
}

有人可以帮助我解决我的代码有什么问题吗?

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

这两个字符串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.time(现代的Java日期和时间API)进行日期和时间工作。 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时,很可能得到不正确的结果。

链接

本文链接:https://www.f2er.com/2538316.html

大家都在问