Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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
将LocalDate转换为java.util.Date时缺少时间信息_Java_Date_Java 8_Localdate - Fatal编程技术网

将LocalDate转换为java.util.Date时缺少时间信息

将LocalDate转换为java.util.Date时缺少时间信息,java,date,java-8,localdate,Java,Date,Java 8,Localdate,将LocalDate转换为java.util.Date时缺少时间信息 我的输入日期格式为2019-08-30T19:47:22+00:00字符串。我必须将其转换为java.util.Data。我想用Java8来做 String input = "2019-08-30T19:47:22+00:00"; Date date = null; LocalDate dateTime = LocalDate.parse(input, DateTimeFormatter.ISO_OFFSET_DATE_TIM

将LocalDate转换为java.util.Date时缺少时间信息

我的输入日期格式为2019-08-30T19:47:22+00:00字符串。我必须将其转换为java.util.Data。我想用Java8来做

String input = "2019-08-30T19:47:22+00:00";
Date date = null;
LocalDate dateTime = LocalDate.parse(input, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
date = Date.from(dateTime.atStartOfDay(ZoneId.systemDefault()).toInstant());
System.out.println("Parsed from LoacalDate: " + date);
System.out.println("From new Date(): " + new Date());
输出

从LoacalDate解析:2019年8月30日星期五00:00:00从纽约CDT 日期:2019年8月30日星期五17:16:23 CDT 在输出时间信息中丢失。如何获取时间信息?

tl;博士 LocalDate只存储一个日期,因此使用了错误的类

java.util.Date                              // Terrible class, now legacy. Avoid. Replaced by `java.time.Instant` in JSR 310. Use only where required, to interoperate with old code not yet updated for java.time.
.from(                                      // Convert from modern `Instant` to legacy `Date`.
    OffsetDateTime                          // The modern class to represent a moment in the context of an offset-from-UTC (a number of hours-minutes-seconds). Not to be confused with a time zone, which is a history of changes to the offset used by the people of a particular region. 
    .parse( "2019-08-30T19:47:22+00:00" )   // Parse text into an `OffsetDateTime` object.
    .toInstant()                            // Extract an `Instant`, a more basic building-block class that represent a moment in UTC (an offset of zero). 
)
.toString()                                 // Generates text representing the value of the `Date`. But this method lies! It dynamically applies your JVM’s current default time zone while generating the text.
请注意,java.util.Date::toString在撒谎!该方法动态应用JVM的当前默认时区,同时生成文本以表示实际使用UTC的值。从不使用此日期类的原因之一

细节 您使用了错误的类

本地日期 LocalDate仅表示日期,不表示一天中的任何时间、时区或偏移量

通过解析将某个时刻表示为一个日期的输入,可以删除一天中的时间和UTC的偏移量

抵销日期时间 您的输入2019-08-30T19:47:22+00:00代表一个时刻:一个日期,一天中的某个时间,与UTC的偏移量为零小时分秒。因此,将其解析为OffsetDateTime

避免遗留日期时间类 java.util.Date类很糟糕,不应该再使用了。几年前,随着JSR310的采用,它被现代的java.time类所取代

但是,如果必须与尚未更新为java.time的旧代码进行互操作,则可以来回转换。查看添加到旧类中的新to…/from…方法

java.util.Date的等价物是java.time.Instant,两者都表示一个瞬间,但分辨率不同,毫秒与纳秒。因此,从更灵活的OffsetDateTime中提取一个基本的即时对象


我能够使用下面的代码片段使它工作

  LocalDateTime dateTime = LocalDateTime.parse(input,DateTimeFormatter.ISO_OFFSET_DATE_TIME);
  date = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
  System.out.println("Parsed from LoacalDate:" + date);
  System.out.println("From new Date():" + new Date());

LocalDate没有时间。如果需要时间,请查看LocalDateTime或ZonedDateTime或OffsetDateTime。但是我很好奇你认为dateTime.atStartOfDay有什么作用。LocalDate的javadoc对这个类说了什么?它代表什么?附带问题:为什么必须将其转换为java.util.Date?现在java.time已经过时5年了-您正在使用旧的API吗?很多东西都转换了,特别是发条缪斯,我正在使用一个图书馆。它需要java.util.DateThiagarajan Ramanathan中的日期,您将丢弃字符串+00:00中的偏移量信息,并替换JVM默认时区的偏移量,在大多数情况下会导致错误的结果。请注意,您不希望打印为Fri Aug 30 19:47:22的日期,而是希望打印的日期与字符串表示的时间相同。
Instant instant = odt.toInstant() ;
java.util.Date d = Date.from( instant ) ;
  LocalDateTime dateTime = LocalDateTime.parse(input,DateTimeFormatter.ISO_OFFSET_DATE_TIME);
  date = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
  System.out.println("Parsed from LoacalDate:" + date);
  System.out.println("From new Date():" + new Date());