Java中各种时间类型相互转换


最近在弄数据分析,涉及到各种时间,因此整理了下转时间的各种方案。解决99%的时间转换问题

参数声明:

下面展示一些 内联代码片

  final Date date = new Date();
  final Timestamp timestamp = new Timestamp(date.getTime());
  final Calendar calendar = Calendar.getInstance();
  final Instant instant = Instant.now();
  final LocalDateTime localDateTime = LocalDateTime.now();
  final ZonedDateTime zonedDateTime = ZonedDateTime.now();
  final LocalDate localDate = LocalDate.now();

转Instant

    //Date转Instant
    Instant dateInstant = date.toInstant();

    //Timestamp转Instant
    Instant timestampInstant = timestamp.toInstant();

    //Calendar转Instant
    Instant calendarInstant = calendar.toInstant();

    //LocalDateTime转Instant
    Instant localDateTimeInstant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();

    //ZonedDateTime转Instant
    Instant zonedDateTimeInstant = zonedDateTime.toInstant();

    //LocalDate转Instant
    Instant localDateInstant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();

转LocalDateTime

   //Date转LocalDateTime
    LocalDateTime dateLocalDateTime = 	     LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

    //Timestamp转LocalDateTime
    LocalDateTime timestampLocalDateTime = timestamp.toLocalDateTime();

    //Calendar转LocalDateTime
    LocalDateTime calendarLocalDateTime = LocalDateTime.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault());

    //Instant转LocalDateTime
    LocalDateTime instantLocalDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

    //ZonedDateTime转LocalDateTime
    LocalDateTime zonedDateTimeLocalDateTime = zonedDateTime.toLocalDateTime();

    //LocalDate转LocalDateTime
    LocalDateTime localDateLocalDateTime = localDate.atStartOfDay();

转ZonedDateTime

   //Date转ZonedDateTime
    ZonedDateTime dateZonedDateTime = ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

    //Timestamp转ZonedDateTime
    ZonedDateTime timestampZonedDateTime = ZonedDateTime.ofInstant(timestamp.toInstant(), ZoneId.systemDefault());

    //Calendar转ZonedDateTime
    ZonedDateTime calendarZonedDateTime = ZonedDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault());

    //Instant转ZonedDateTime
    ZonedDateTime instantZonedDateTime = instant.atZone(ZoneId.systemDefault());

    //LocalDateTime转ZonedDateTime
    ZonedDateTime localDateTimeZonedDateTime = localDateTime.atZone(ZoneId.systemDefault());

    //LocalDate转ZonedDateTime
    ZonedDateTime localDateZonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());

转Date

    //Timestamp转Date
    Date timestampDate = new Date(timestamp.getTime());

    //Calendar转Date
    Date calendarDate = calendar.getTime();

    //Instant转Date
    Date instantDate = Date.from(instant);

    //LocalDateTime转Date
    Date localDateTimeDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

    //ZonedDateTime转Date
    Date zonedDateTimeDate = Date.from(zonedDateTime.toInstant());

    //LocalDate转Date
    Date localDateDate = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

转Timestamp

    //Date转Timestamp
    Timestamp dateTimestamp = new Timestamp(date.getTime());

    //Calendar转Timestamp
    Timestamp calendarTimestamp = new Timestamp(calendar.getTimeInMillis());

    //Instant转Timestamp
    Timestamp instantTimestamp = Timestamp.from(instant);

    //LocalDateTime转Timestamp
    Timestamp localDateTimeTimestamp = Timestamp.valueOf(localDateTime);

    //ZonedDateTime转Timestamp
    Timestamp zonedDateTimeTimestamp = Timestamp.from(zonedDateTime.toInstant());

    //LocalDate转Timestamp
    Timestamp localDateTimestamp = Timestamp.valueOf(localDate.atStartOfDay());

转Calendar

    //Date转Calendar
    Calendar dateCalendar = Calendar.getInstance();
    dateCalendar.setTime(date);

    //Timestamp转Calendar
    Calendar timestampCalendar = Calendar.getInstance();
    timestampCalendar.setTimeInMillis(timestamp.getTime());

    //Instant转Calendar
    Calendar instantCalendar = GregorianCalendar.from(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()));

    //LocalDateTime转Calendar
    Calendar localDateTimeCalendar = GregorianCalendar.from(ZonedDateTime.of(localDateTime, ZoneId.systemDefault()));

    //ZonedDateTime转Calendar
    Calendar zonedDateTimeInstantCalendar = GregorianCalendar.from(zonedDateTime);

    //LocalDate转Calendar
    Calendar localDateCalendar = GregorianCalendar.from(localDate.atStartOfDay(ZoneId.systemDefault()));

转LocalDate

    //Date转LocalDate
    LocalDate dateLocalDate = LocalDate.ofInstant(date.toInstant(), ZoneId.systemDefault());  //jdk11

    LocalDate dateLocalDate = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();

    //Timestamp转LocalDate
    LocalDate timestampLocalDate = timestamp.toLocalDateTime().toLocalDate();

    //Calendar转LocalDate
    LocalDate calendarLocalDate = LocalDate.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault());  //jdk11

    LocalDate calendarLocalDate = LocalDateTime.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault()).toLocalDate();

    //Instant转LocalDate
    LocalDate instantLocalDate = LocalDate.ofInstant(instant, ZoneId.systemDefault());  //jdk11

    LocalDate instantLocalDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate();

    //LocalDateTime转LocalDate
    LocalDate localDateTimeLocalDate = localDateTime.toLocalDate();

    //ZonedDateTime转LocalDate
    LocalDate zonedDateTimeLocalDate = zonedDateTime.toLocalDate();
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java ,`java.time.Duration` 类用于表示两个时间点之间的持续时间,而 `java.time.LocalDateTime` 则代表了一个特定的日期和时间。虽然 `Duration` 和 `LocalDateTime` 表示的时间信息不同,但在某些场景下,你可能需要将它们相互转换。 ### 将 Duration 转换为 LocalDateTime 假设你需要将某个 `Duration` 对象转换为包含相同总时间量的 `LocalDateTime` 对象,那么你可以通过以下步骤操作: 1. **创建一个初始 DateTime 对象**:首先,你需要有一个完整的日期或时间作为参考点。这通常是通过 `LocalDate` 或 `LocalTime` 创建的对象,然后使用 `atStartOfDay()` 或 `now()` 等方法获取当前日期或其他日期。 2. **添加 Duration**:然后,将 `Duration` 对象添加到这个初始日期时间上,得到新的 `LocalDateTime` 实例。这可以使用 `plusDays()`, `plusHours()`, `plusMinutes()`, `plusSeconds()` 或者 `plusMillis()` 方法来分别增加天数、小时、分钟、秒和毫秒。 这里是一个具体的示例代码段: ```java import java.time.*; public class DurationToLocalDateTime { public static void main(String[] args) { // 创建一个初始日期时间,例如今天早上0点 LocalDate baseDate = LocalDate.now().withHour(0).withMinute(0).withSecond(0).withNano(0); // 定义一个持续时间,例如5天 Duration durationToAdd = Duration.ofDays(5); // 将 duration 添加到初始日期时间上,获得新的 LocalDateTime LocalDateTime newDateTime = baseDate.atStartOfDay().plus(durationToAdd); System.out.println("原始时间点: " + baseDate); System.out.println("添加了" + durationToAdd.toDays() + "天后的日期时间: " + newDateTime); } } ``` 在这段代码,我们首先创建了一个基于当前日期的初始 `LocalDate` 对象,并设置了时间为一天的开始(即每天的时间都是0点)。接着,我们创建了一个 `Duration` 对象,表示我们需要添加的天数。最后,我们将 `Duration` 对象添加到了初始日期时间上,得到了一个新的 `LocalDateTime` 对象。 ### 相关问题: 1. **如何将 LocalDateTime 转换成 Duration?** - 可能需要先确定两个时间点之间的时间差,然后再将其转换为 `Duration`。通常需要计算出起始时间和结束时间点,然后从 `LocalDateTime` 对象提取出日期和时间部分来进行比较。 2. **何时不应该尝试将 Duration 转换为 LocalDateTime?** - 如果目的不是为了显示一个具体的日期和时间点,而是仅仅想表示一段持续的时间,那么就不应该尝试将 `Duration` 转换为 `LocalDateTime`。因为后者包含了确切的日期和时间信息,而在许多应用场景,只需要持续时间的信息即可。 3. **在哪些情况下可能需要用到 Duration 和 LocalDateTime 的组合使用?** - 在安排日程、计划会议、分析事件发生的持续时间等场景,可能就需要同时使用两者。例如,在一个日历应用,需要表示某事件发生的具体日期和时间,以及该事件持续的时间长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值