【问题标题】:Which type of date format it is?? "2018-09-06T10:12:21-0300"它是哪种类型的日期格式? “2018-09-06T10:12:21-0300”
【发布时间】:2021-11-11 14:21:00
【问题描述】:

它是什么类型的日期格式?

"2018-09-06T10:12:21-0300"

我怎样才能把它格式化成类似"06 Sep" ???

【问题讨论】:

标签: android date kotlin format


【解决方案1】:

它是什么类型的日期格式?

此格式是 ISO 8601 标准之一,但显然不适用于 java.time.format.DateTimeFormatter,它认为它是一种自定义格式,由 ISO 标准日期和时间加上与 UTC 的偏移量组成,小时之间没有分隔符(冒号)和分钟。

我怎样才能把它格式化成类似"06 Sep" ???

您需要定义两个DateTimeFormatters,一个用于解析非标准输入,另一个用于输出月份的日期和缩写的月份名称。这是一个例子:

fun main(args: Array<String>) {
    // some non-ISO formatted String
    val inputDateTime = "2018-09-06T10:12:21-0300"
    // build up a DateTimeFormatter that can parse such a String
    val inputParser = DateTimeFormatterBuilder()
                        // date part uuuu-MM-dd
                        .append(DateTimeFormatter.ISO_LOCAL_DATE)
                        .appendLiteral('T') // the T separating date from time
                        // the time of day part
                        .append(DateTimeFormatter.ISO_LOCAL_TIME)
                        // the offset part without a separator between hours and minutes
                        .appendPattern("X")
                        // (just for completeness) a locale
                        .toFormatter(Locale.ENGLISH)
    // parse the String to an OffsetDateTime
    val offsetDateTime = OffsetDateTime.parse(inputDateTime, inputParser)
    // define another formatter for output, make it only use day of month and abbreviated month in English
    val outputFormatter = DateTimeFormatter.ofPattern("dd MMM", Locale.ENGLISH)
    // print the results
    println("$offsetDateTime ---> ${offsetDateTime.format(outputFormatter)}")
}

示例输出:

2018-09-06T10:12:21-03:00 ---> 06 Sep

【讨论】:

  • AFAIK,模式中的X 不是没有小时-分钟分隔符,而是用字母Z 而不是+00:00 表示偏移量0
  • 是的,@Joffrey,我也读过。但不幸的是,这种方式是经典 try-and-error 案例中的第一个工作方式,我从根本没有格式化程序开始,然后使用不同数量的x,最后发现解析确实有效有一个X
  • 我的意思是XZ 都可以工作。单个字母代表整个偏移量(带或不带小时/分钟分隔符)。这与此特定格式化日期的偏移表示中小时和分钟之间没有分隔符这一事实无关。
  • ...这让OffsetDateTime.parse(text) 在不自定义格式化程序的情况下无法工作更令人惊讶
【解决方案2】:

此格式遵循ISO 8601 标准,用于表示带有时区信息的日期/时间。

有足够的信息可以将此字符串解析为 OffsetDateTime,但显然 Java 的格式化程序对于偏移表示中小时和分钟之间缺少的分隔符有点严格(这在技术上是标准允许的)。这意味着普通的OffsetDateTime.parse(text) 会抛出异常。

因此,您将按照@deHaar 的说明定义一个自定义DateTimeFormatter

【讨论】:

  • 如果不明确定义非 ISO 格式化程序,我将无法解析它……请参阅我的答案。你真的可以那样解析它(而我的系统不能)还是你只是期望它能够工作(但没有尝试)?
  • 有趣的是,我希望 Java 的解析器能够接受 ISO 规范的所有变体。我想我错了。
  • 是的,您的链接让我意识到自己在另一个方面是错误的:String 不是自定义格式,而是 ISO 8601。
  • java.time 的 one-arg parse 方法仅解析 ISO 8601 的最常见变体。有许多变体。这个冒号可能是那些 one.arg parse(CharSequence) 方法中最常遇到的许多限制。也见the answer by Meno Hochschild here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2018-07-22
  • 2022-12-22
相关资源
最近更新 更多