Kotlin DateTimeParseException
Kotlin DateTimeParseException
从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”。
- 您的格式化程序与输入格式不匹配。基本上你需要两个格式化程序:一个用于输入,一个用于输出。
- 格式“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))
您不需要任何格式化程序来解析您的输入字符串
您输入的字符串,2006-03-25T10:30:00+12:00
已经是 OffsetDateTime#parse
使用的默认格式,因此,您不需要显式使用格式化程序来解析输入的日期时间字符串。
m
指定 分钟 而 M
指定 月
您错误地将 m
用于符号为 M
的月份。查看 documentation page 以了解有关这些符号的更多信息。
比y
更喜欢u
y
指定 纪元 (纪元指定为 AD
或 BC
)并且始终为正数而 u
指定 year 这是一个带符号的 (+/-) 数字。通常,我们不使用 +
符号来写正数,但我们总是用 -
符号指定负数。同样的规则适用于 年 。只要您要使用时代的年份,AD
(大多数情况下都是如此),y
和 u
都会给您相同的数字。但是,当您使用时代的年份 BC
例如年代、1 BC
指定为年份、0
; year-of-era、2 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
了解有关现代日期时间的更多信息 API
从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”。
- 您的格式化程序与输入格式不匹配。基本上你需要两个格式化程序:一个用于输入,一个用于输出。
- 格式“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))
您不需要任何格式化程序来解析您的输入字符串
您输入的字符串,2006-03-25T10:30:00+12:00
已经是 OffsetDateTime#parse
使用的默认格式,因此,您不需要显式使用格式化程序来解析输入的日期时间字符串。
m
指定 分钟 而 M
指定 月
您错误地将 m
用于符号为 M
的月份。查看 documentation page 以了解有关这些符号的更多信息。
比y
更喜欢u
y
指定 纪元 (纪元指定为 AD
或 BC
)并且始终为正数而 u
指定 year 这是一个带符号的 (+/-) 数字。通常,我们不使用 +
符号来写正数,但我们总是用 -
符号指定负数。同样的规则适用于 年 。只要您要使用时代的年份,AD
(大多数情况下都是如此),y
和 u
都会给您相同的数字。但是,当您使用时代的年份 BC
例如年代、1 BC
指定为年份、0
; year-of-era、2 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
了解有关现代日期时间的更多信息 API