【问题标题】:Kotlin DateTimeParseExceptionKotlin DateTimeParseException
【发布时间】:2021-04-30 16:17:06
【问题描述】:

https://api.spacexdata.com/v3/launches 获取日期 该日期的格式为:2006-03-25T10:30:00+12:00。 我想将其转换为“dd,mm,yyyy”,但总是出错: “java.time.format.DateTimeParseException:无法解析文本'2006-03-25T10:30:00+12:00',在索引10处找到未解析的文本”

我的代码:

val formatter = DateTimeFormatter.ofPattern("dd, mm, yyyy", Locale.US)
val myDate = LocalDate.parse(launchDate, formatter)

var launchDateConverted: String=  myDate.toString()

我在字符串中获取数据,然后将其转换为日期以进行格式化,然后将日期转换回字符串以在 UI 上显示。我使用了不同的方法,但找不到正确的方法。 我当前的语言环境是“RU”。

【问题讨论】:

    标签: datetime kotlin java-time datetimeformatter offsetdatetime


    【解决方案1】:
    1. 您的格式化程序与输入格式不匹配。基本上你需要两个格式化程序:一个用于输入,一个用于输出。
    2. “dd, mm, yyyy”格式错误:mm 代表小时的分钟,而不是月。您应该使用“dd, MM, yyyy”。
    val launchDate = "2006-03-25T10:30:00+12:00"
    
    val inputFormatter = DateTimeFormatter.ISO_DATE_TIME
    val myDate = LocalDate.parse(launchDate, inputFormatter)
    
    val outputFormatter = DateTimeFormatter.ofPattern("dd, MM, yyyy", Locale.US)
    println(outputFormatter.format(myDate))
    

    【讨论】:

      【解决方案2】:

      您不需要任何格式化程序来解析您的输入字符串

      您输入的字符串,2006-03-25T10:30:00+12:00 已经是 OffsetDateTime#parse 使用的默认格式,因此,您无需显式使用格式化程序来解析输入的日期时间字符串。

      m 指定分钟,而M 指定

      您错误地将m 用于符号为M 的月份。查看documentation page 了解有关这些符号的更多信息。

      更喜欢u 而不是y

      y 指定时代(时代指定为ADBC)并且始终为正数,而u 指定年份 这是一个带符号的 (+/-) 数字。通常,我们不使用+ 符号来写入正数,但我们总是使用- 符号指定负数。同一规则适用于 。只要您要使用时代的一年,AD(大多数情况下),yu 都会给您相同的数字。但是,当您使用时代的年份时,会出现差异,BC 例如时代1 BC被指定为0year-of-era2 BC 被指定为 year-1 等等。您可以通过以下演示更好地理解它:

      import java.time.LocalDate;
      import java.time.format.DateTimeFormatter;
      
      public class Testing {
          public static void main(String[] args) {
              System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
              System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
              System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));
      
              System.out.println();
      
              System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
              System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
              System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));
      
              System.out.println();
      
              System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
              System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
              System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));
          }
      }
      

      输出:

      -1 1 1
      2 1 1
      2BC 1 1
      
      0 1 1
      1 1 1
      1BC 1 1
      
      1 1 1
      1 1 1
      1AD 1 1
      

      注意:我使用 Java 来演示该解决方案,但它也适用于 Kotlin。

      最终解决方案:

      import java.time.OffsetDateTime;
      import java.time.format.DateTimeFormatter;
      import java.util.Locale;
      
      public class Main {
          public static void main(String[] args) {
              OffsetDateTime odt = OffsetDateTime.parse("2006-03-25T10:30:00+12:00");
              System.out.println(odt);
      
              // Format it into the desired pattern
              DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd, MM, uuuu", Locale.US);
              String formatted = dtf.format(odt);
              System.out.println(formatted);
          }
      }
      

      输出:

      2006-03-25T10:30+12:00
      25, 03, 2006
      

      Trail: Date Time 了解有关现代日期时间 API 的更多信息。

      【讨论】:

        猜你喜欢
        • 2020-09-15
        • 2018-09-27
        • 1970-01-01
        • 2020-09-06
        • 2018-10-15
        • 1970-01-01
        • 2019-07-01
        • 2021-11-30
        • 2020-06-10
        相关资源
        最近更新 更多