Kotlin DateTimeParseException

bbo*_*boy 2 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()
Run Code Online (Sandbox Code Playgroud)

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

Arv*_*ash 7

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

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

m指定分钟M指定月份

您错误地使用了m符号为 的月份M。查看文档页面以了解有关这些符号的更多信息。

u喜欢y

y指定纪元年份(纪元指定为ADBC)并且始终为正数,而u指定年份为有符号 (+/-) 数字。通常,我们不使用+符号来写正数,但我们总是用符号来指定负数-。同样的规则适用一年。只要您要使用纪元的年份AD(大多数情况都是如此),两者y都会u给您相同的数字。然而,当您使用纪元的年份时,就会出现差异,BC例如,year -ofera1 BC被指定为year , 0; Year -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")));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

-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
Run Code Online (Sandbox Code Playgroud)

注意:我使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2006-03-25T10:30+12:00
25, 03, 2006
Run Code Online (Sandbox Code Playgroud)

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