java time to date_将java.util.Date转换为java.time.LocalDate

更好的办法是:Date date = ...;Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate()

该版本的优点:的实例,而不管输入是java.util.Date或者是子类java.sql.Date(不像@JodaStephen的方式)。这在JDBC原始数据中很常见。java.sql.Date.toInstant()总是抛出异常。

JDK 8和JDK 7的JSR-310后端也是一样的

我个人使用了一个实用程序类(但这不是与backport兼容的):/**

* Utilities for conversion between the old and new JDK date types

* (between {@code java.util.Date} and {@code java.time.*}).

*

* All methods are null-safe.

*/public class DateConvertUtils {

/**

* Calls {@link #asLocalDate(Date, ZoneId)} with the system default time zone.

*/

public static LocalDate asLocalDate(java.util.Date date) {

return asLocalDate(date, ZoneId.systemDefault());

}

/**

* Creates {@link LocalDate} from {@code java.util.Date} or it's subclasses. Null-safe.

*/

public static LocalDate asLocalDate(java.util.Date date, ZoneId zone) {

if (date == null)

return null;

if (date instanceof java.sql.Date)

return ((java.sql.Date) date).toLocalDate();

else

return Instant.ofEpochMilli(date.getTime()).atZone(zone).toLocalDate();

}

/**

* Calls {@link #asLocalDateTime(Date, ZoneId)} with the system default time zone.

*/

public static LocalDateTime asLocalDateTime(java.util.Date date) {

return asLocalDateTime(date, ZoneId.systemDefault());

}

/**

* Creates {@link LocalDateTime} from {@code java.util.Date} or it's subclasses. Null-safe.

*/

public static LocalDateTime asLocalDateTime(java.util.Date date, ZoneId zone) {

if (date == null)

return null;

if (date instanceof java.sql.Timestamp)

return ((java.sql.Timestamp) date).toLocalDateTime();

else

return Instant.ofEpochMilli(date.getTime()).atZone(zone).toLocalDateTime();

}

/**

* Calls {@link #asUtilDate(Object, ZoneId)} with the system default time zone.

*/

public static java.util.Date asUtilDate(Object date) {

return asUtilDate(date, ZoneId.systemDefault());

}

/**

* Creates a {@link java.util.Date} from various date objects. Is null-safe. Currently supports:

{@link java.util.Date}

{@link java.sql.Date}

{@link java.sql.Timestamp}

{@link java.time.LocalDate}

{@link java.time.LocalDateTime}

{@link java.time.ZonedDateTime}

{@link java.time.Instant}

*

* @param zone Time zone, used only if the input object is LocalDate or LocalDateTime.

*

* @return {@link java.util.Date} (exactly this class, not a subclass, such as java.sql.Date)

*/

public static java.util.Date asUtilDate(Object date, ZoneId zone) {

if (date == null)

return null;

if (date instanceof java.sql.Date || date instanceof java.sql.Timestamp)

return new java.util.Date(((java.util.Date) date).getTime());

if (date instanceof java.util.Date)

return (java.util.Date) date;

if (date instanceof LocalDate)

return java.util.Date.from(((LocalDate) date).atStartOfDay(zone).toInstant());

if (date instanceof LocalDateTime)

return java.util.Date.from(((LocalDateTime) date).atZone(zone).toInstant());

if (date instanceof ZonedDateTime)

return java.util.Date.from(((ZonedDateTime) date).toInstant());

if (date instanceof Instant)

return java.util.Date.from((Instant) date);

throw new UnsupportedOperationException("Don't know hot to convert " + date.getClass().getName() + " to java.util.Date");

}

/**

* Creates an {@link Instant} from {@code java.util.Date} or it's subclasses. Null-safe.

*/

public static Instant asInstant(Date date) {

if (date == null)

return null;

else

return Instant.ofEpochMilli(date.getTime());

}

/**

* Calls {@link #asZonedDateTime(Date, ZoneId)} with the system default time zone.

*/

public static ZonedDateTime asZonedDateTime(Date date) {

return asZonedDateTime(date, ZoneId.systemDefault());

}

/**

* Creates {@link ZonedDateTime} from {@code java.util.Date} or it's subclasses. Null-safe.

*/

public static ZonedDateTime asZonedDateTime(Date date, ZoneId zone) {

if (date == null)

return null;

else

return asInstant(date).atZone(zone);

}}

这个asLocalDate()方法是空安全的,请使用toLocalDate(),如果输入是java.sql.Date(为了避免时区问题或不必要的计算,JDBC驱动程序可能会过度使用),否则会使用上述方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值