有没有一种简单的方法可以将LocalDate
(Java 8引入)转换为java.util.Date
对象?
通过'简单',我的意思是比这更简单:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
这对我来说似乎有点尴尬。
由于我们只对日期部分感兴趣,并且两个对象中都没有时区信息,为什么要明确引入时区?应该隐式采用午夜时间和系统默认时区进行转换。
答案 0 :(得分:118)
实际上有。 java.sql.Date
对象中有一个静态方法valueOf就是这样做的。所以我们有
java.util.Date date = java.sql.Date.valueOf(localDate);
就是这样。没有明确设置时区,因为隐式采用了本地时区。
来自docs:
提供的LocalDate被解释为本地的本地日期 时区。
java.sql.Date
子类java.util.Date
所以结果也是java.util.Date
。
对于反向操作,java.sql.Date类中有一个toLocalDate方法。所以我们有:
LocalDate ld = new java.sql.Date(date.getTime()).toLocalDate();
答案 1 :(得分:72)
有没有一种简单的方法可以将LocalDate(Java 8引入)转换为java.util.Date对象?通过'简单',我的意思是比这更简单
不。你做得恰当,尽可能简洁。
java.util.Date.from( // Convert from modern java.time class to troublesome old legacy class. DO NOT DO THIS unless you must, to inter operate with old code not yet updated for java.time.
myLocalDate.atStartOfDay( // Let java.time determine the first moment of the day on that date in that zone. Never assume the day starts at 00:00:00.
ZoneId.of( "America/Montreal" ) // Specify time zone using proper name in `continent/region` format, never 3-4 letter pseudo-zones such as “PST”, “CST”, “IST”.
) // Produce a `ZonedDateTime` object.
.toInstant() // Extract an `Instant` object, a moment always in UTC.
)
请阅读下面的问题,然后再考虑一下。怎么会更简单?如果你问我约会的时间是什么时候开始的,我怎么回答却问你“哪里?”?新的一天在巴黎FR早些时候比在加利福尼亚州的蒙特利尔,早些时候在加尔各答IN,甚至早些时候在新西兰奥克兰,所有不同的时刻。
因此,在将仅限日期(LocalDate
)转换为日期时,我们必须应用时区(ZoneId
)才能获得分区值({{ 1}}),然后转入UTC(ZonedDateTime
)以匹配Instant
的定义。
首先,尽可能避免旧的遗留日期时间类,例如java.util.Date
。它们的设计很糟糕,令人困惑,也很麻烦。实际上,出于某种原因,它们被java.time类取代了许多的原因。
但如果必须,您可以将java.time类型转换为旧版本。寻找添加到旧类的新转换方法。
java.util.Date
→java.util.Date
请注意,java.time.LocalDate
是一个误称,因为它代表一个日期加上一个时间段,以UTC为单位。相反,LocalDate
类表示没有时间且没有时区的仅日期值。
从java.util.Date
转到java.time意味着转换为等效的java.util.Date
类。 Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。
java.time.Instant
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
所以我们需要将Instant instant = myUtilDate.toInstant();
移到时区。我们应用Instant
来获取ZoneId
。
ZonedDateTime
从那里,请求仅限日期,ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
。
LocalDate
LocalDate ld = zdt.toLocalDate();
→java.time.LocalDate
要移动另一个方向,从java.util.Date
到java.time.LocalDate
意味着我们将从仅限日期转到日期时间。所以我们必须指定一个时间。你可能想要一天中的第一时间。 不假设是java.util.Date
。夏令时(DST)等异常意味着第一时刻可能是另一个时间,例如00:00:00
。让java.time通过调用01:00:00
上的atStartOfDay
确定该值。
LocalDate
现在提取ZonedDateTime zdt = myLocalDate.atStartOfDay( z );
。
Instant
通过调用from( Instant )
将Instant instant = zdt.toInstant();
转换为Instant
。
java.util.Date
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.util.Date d = java.util.Date.from( instant );
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:15)
日期 - > LOCALDATE:
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate - >日期:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
答案 3 :(得分:2)
DateDate日期
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate to Date
LocalDate localDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
答案 4 :(得分:0)
将LocalDateTime转换为java.util.Date
AttributeError: 'zipline.assets._assets.Equity' object has no attribute 'history'
答案 5 :(得分:-2)
我用下面的解决方案解决了这个问题
_sprites = new List<Sprite>()
{
new Sprite(_content.Load<Texture2D>("Content/Block.png"))
{
Position = new Vector2f(100, 100),
Input = new Input(Key.A, Key.D, Key.W, Key.S),
},
};
在这种情况下,localDate会以“yyyy-MM-dd”格式打印您的日期
答案 6 :(得分:-4)
您可以将java.util.Date
对象转换为String
对象,该对象会将日期格式设置为yyyy-mm-dd。
LocalDate有一个parse
方法,可将其转换为LocalDate
对象。该字符串必须表示有效日期,并使用DateTimeFormatter.ISO_LOCAL_DATE进行解析。
DateDate日期
LocalDate.parse(Date.toString())