解析“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)
)
谁能帮我解决我的代码有什么问题?
【问题讨论】:
我建议您不要使用SimpleDateFormat
、Date
和Calendar
。所有这些类都设计得很糟糕并且已经过时了,尤其是第一个类是出了名的麻烦。而是使用OffsetDateTime
、DateTimeFormatter
和来自java.time, the modern Java date and time API 的其他类。
您可能还想用您使用的语言标记您的问题。
【参考方案1】:
这两个字符串 — 2020-03-30T07:37:02.282+01:00
和 2020-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 格式化表格的主要内容,如果未能解决你的问题,请参考以下文章