Kotlin 日期时间解析异常

时间:2021-01-26 20:29:33

标签: datetime kotlin java-time datetimeformatter offsetdatetime

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”。

2 个答案:

答案 0 :(得分:2)

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

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

m 指定分钟M指定

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

u更喜欢y

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

-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")));
    }
}

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

最终解决方案:

-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

输出:

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);
    }
}

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

答案 1 :(得分: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))
相关问题