格式为2018-11-26T15:12:03.000-0800的字符串,格式为java.time.localdatetime;年月日HH:mm:ss a z“;转换引发异常
我编写了一个util函数,将格式为2018-11-26T15:12:03.000-0800的字符串时间值转换为格式为“M/dd/yy HH:mm:ss a z”的localdatetime 格式为2018-11-26T15:12:03.000-0800的字符串到格式为“M/dd/yy HH:mm:ss a z”的java.time.localdatetime转换引发异常格式为2018-11-26T15:12:03.000-0800的字符串,格式为java.time.localdatetime;年月日HH:mm:ss a z“;转换引发异常,java,datetime,datetime-format,java-time,datetime-parsing,Java,Datetime,Datetime Format,Java Time,Datetime Parsing,我编写了一个util函数,将格式为2018-11-26T15:12:03.000-0800的字符串时间值转换为格式为“M/dd/yy HH:mm:ss a z”的localdatetime 格式为2018-11-26T15:12:03.000-0800的字符串到格式为“M/dd/yy HH:mm:ss a z”的java.time.localdatetime转换引发异常 public static LocalDateTime convertStringToTime(String time){
public static LocalDateTime convertStringToTime(String time){
String pattern = "M/dd/yy HH:mm z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(time,formatter);
return zonedDateTime.toLocalDateTime();
}
这给了我以下的例外
java.time.format.DateTimeParseException: Text '2018-11-26T12:45:23.000-0800' could not be parsed at index 4
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
你说你想要:a
LocalDateTime
格式的M/dd/yy HH:mm:ss a z
。这是不可能的,原因有三:
LocalDateTime
不能有格式。它的toString
方法总是返回类似2018-11-26T15:12:03
(ISO 8601格式)的字符串,我们无法更改它。您也不应该需要具有特定格式的LocalDateTime
;我在底部添加了一个链接来解释为什么不z
指的是时区缩写,比如太平洋夏令时的PDT
。LocalDateTime
既没有UTC偏移量也没有时区,因此这没有意义 ZoneId zone = ZoneId.of("America/Whitehorse");
DateTimeFormatter inputFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
DateTimeFormatter desiredFormatter
= DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.LONG)
.withLocale(Locale.US);
String time = "2018-11-26T15:12:03.000-0800";
OffsetDateTime dateTime = OffsetDateTime.parse(time, inputFormatter);
String formattedDateTime = dateTime.atZoneSameInstant(zone)
.format(desiredFormatter);
System.out.println("Converted format: " + formattedDateTime);
输出为:
转换格式:太平洋标准时间2018年11月26日下午3:12:03
要将日期和时间从一种格式的字符串转换为另一种格式的字符串,您通常需要两个DateTimeFormatter
s:一个指定您拥有的字符串的格式,另一个指定您想要的格式
与其从格式模式字符串构建自己的格式化程序,不如尽可能依赖内置格式。在我们的例子中,我指定日期为FormatStyle.SHORT
(给出两位数的年份),时间为FormatStyle.LONG
,给出时区的缩写
依赖内置格式的想法可以更进一步。您得到的字符串是ISO 8601格式的,因此我们只需要将两部分拼接在一起:
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendOffset("+HHmm", "Z")
.toFormatter();
它更长,但不太容易出错
链接
- 解释为什么不需要具有格式的日期时间对象
2018-11-26T15:12:03.000-0800
如何匹配M/dd/yy HH:mm z
?我也会花更少的时间“关心”格式,只允许数据库/jdbc驱动程序处理,因为您不应该将日期存储在数据库中作为String
sso我想将格式为“2018-11-26T15:12:03.000-0800”的字符串转换为格式为“M/dd/yy HH:mm z”的本地日期时间许多新的JDBC驱动程序允许您执行以下操作:LocalDate LocalDate=rs.getObject(1,LocalDate.class))代码>,但您必须查阅数据库驱动程序文档。或者,如果没有这种支持,您“可以”将Local/ZonedDateTime
转换为java.sql.Date
对象,然后简单地使用它-这很混乱,但比尝试处理字符串操作要好得多是的,我理解您“想要”做什么,但我试图告诉您这不是最好的方法。此类数据不应作为纯文本进行管理,而应作为“对象”数据进行管理。因为大多数数据库都支持日期/时间类型,所以您应该尽可能地利用这种支持。然后还要理解,当“解析”日期/时间值时,模式必须在未来的值格式中匹配aLocalDateTime
没有格式(如不能有格式)。可能是部分复制品。也很明显与此有关。