格式化格式为“ 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)
)
}
}
有人可以帮助我解决我的代码有什么问题吗?
这两个字符串-2020-03-30T07:37:02.282+01:00
和2020-03-30T05:44:02.397Z
-具有相同的格式。格式为ISO8601。在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的偏移量,需要照此解析,否则您将无法解析该字符串,或者-更糟的是,您可能会冒险获得不正确的结果。
Link: Oracle tutorial: Date Time解释如何使用java.time。