我在格式化类型为"2020-03-30T07:37:02.282+01:00"的日期和时间时遇到问题我正在从我的服务器上获得这两种格式的日期"2020-03-30T07:37:02.282+01:00"one_answers"2020-03-30T05:44:2.397Z"我认为我使用了正确的时间,但不确定在分析时,我得到了日期类型"2020-0-3-0T07:37:02.282+01:00"的可解析预期,但我能够分析类型为"2020-03-3 0T05:34:2.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
具有相同的格式。格式为ISO 8601(请参阅底部的链接(。在ISO 8601中,与UTC(或GMT(的偏移量可以给定为零的Z
,或者例如1小时0分钟的+01:00
(存在更多变体(。
对于您的日期和时间工作,您应该更喜欢使用现代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教程:日期时间,解释如何使用java.Time
- 维基百科文章:ISO 8601