【发布时间】:2020-09-03 17:53:57
【问题描述】:
所以,我知道这是一个很好讨论的问题,有很多问题和答案(主要是关于 Joda),还有新的 DateTimeFormatter 类和所有支持 26 级以上 api 级别的东西。但我担心的是:
- 我的android应用支持21及以上
- 我从不同的 API 获得了 ISO-8601 日期/时间格式的多种变体: 例如:a) “2020-09-03T17:03:11.719566Z” b) “2021-03-05T18:30:00Z”
所以,我需要找到今天和那个日期之间的#days。当我编写代码来解析其中一个时,另一个会碰到我的 catch 块,反之亦然,所以我编写了一个嵌套的 try/catch 块来处理这两种情况......就像这样:
fun getFormattedDate(stringDate: String?): Long {
if (dueDateString.isNullOrEmpty())
return 0
val today = Calendar.getInstance().time
try {
val inputFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH)
val date = inputFormat.parse(dueDateString)
return if (date != null) {
val dueCalendar = Calendar.getInstance()
dueCalendar.time = date
getNoOfDays(today.time, dueCalendar.timeInMillis)
} else
0
} catch (ex: Exception) {
ex.showLog()
try {
val inputFormat1 = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH)
val date = inputFormat1.parse(dueDateString)
return if (date != null) {
val dueCalendar = Calendar.getInstance()
dueCalendar.time = date
getNoOfDays(today.time, dueCalendar.timeInMillis)
} else
0
} catch (exc: Exception) {
exc.showLog()
return 0
}
}
}
我正在使用这个函数来查找两个日期之间的#days:
fun getDueDateAfterParsing(dueDateString: String?): Long {
val today = ZonedDateTime.ofInstant(now(), ZoneId.systemDefault())
val dueDate = ZonedDateTime.parse(
dueDateString,
DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault())
)
return ChronoUnit.DAYS.between(today, dueDate)
}
我很确定这个问题的解决方案不会这么复杂。 ISO-8601 有很多格式,所以我不能编写适合所有情况的 try/catch 块,对吧?那么任何人都可以帮助我用最简单的方法来解决这个问题吗?
我也考虑过正则表达式,他们中的大多数人最终会说我猜是 Joda,但至少我想确定什么是最佳方式或最佳方式。
提前感谢您的帮助。
【问题讨论】:
-
最优化的方式是
java.time的ThreeTenABP backport。
标签: java android kotlin simpledateformat iso8601