Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
格式为2018-11-26T15:12:03.000-0800的字符串,格式为java.time.localdatetime;年月日HH:mm:ss a z“;转换引发异常_Java_Datetime_Datetime Format_Java Time_Datetime Parsing - Fatal编程技术网

格式为2018-11-26T15:12:03.000-0800的字符串,格式为java.time.localdatetime;年月日HH:mm:ss a z“;转换引发异常

格式为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){

我编写了一个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){
    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偏移量也没有时区,因此这没有意义
  • 您的输入时间字符串也不包含任何时区,只包含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
    对象,然后简单地使用它-这很混乱,但比尝试处理字符串操作要好得多是的,我理解您“想要”做什么,但我试图告诉您这不是最好的方法。此类数据不应作为纯文本进行管理,而应作为“对象”数据进行管理。因为大多数数据库都支持日期/时间类型,所以您应该尽可能地利用这种支持。然后还要理解,当“解析”日期/时间值时,模式必须在未来的值格式中匹配a
    LocalDateTime
    没有格式(如不能有格式)。可能是部分复制品。也很明显与此有关。