Java 从多个方面详解 Date 转 LocalDateTime

Java 从多个方面详解 Date 转 LocalDateTime

Java 从多个方面详解 Date 转 LocalDateTime

1. 引言

Java 开发中,我们经常需要处理日期和时间的操作。Java 提供了多种日期和时间相关的类,其中 java.util.Date 是最早的日期类,而 java.time.LocalDateTime 是在 Java 8 新增的日期和时间类。为了在项目开发过程中能够正确地使用新的日期和时间类,我们需要了解如何将 Date 类转换为 LocalDateTime 类。本文将从多个方面详解这个问题。

2. 通过 toInstant() 方法

在 Java 8 中,java.util.Date 类新增了 toInstant() 方法,该方法用于将 Date 类转换为 java.time.Instant 类。而 Instant 类可以通过 atZone() 方法转换为 java.time.ZonedDateTime 类,再通过调用 toLocalDateTime() 方法转换为 LocalDateTime 类。

import java.util.Date;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class DateToLocalDateTimeExample {
    public static void main(String[] args) {
        Date date = new Date();
        LocalDateTime localDateTime = date.toInstant()
                .atZone(ZoneId.systemDefault()).toLocalDateTime();

        System.out.println("Date: " + date);
        System.out.println("LocalDateTime: " + localDateTime);
    }
}

运行结果如下:

Date: Sat Jun 26 14:45:57 CST 2021
LocalDateTime: 2021-06-26T14:45:57

通过使用 toInstant() 方法和转换的中间类,我们可以将 Date 类转换为 LocalDateTime 类。

3. 通过 Instant.ofEpochMilli() 方法

如果我们有一个表示毫秒数的 long 类型变量,我们也可以通过 Instant.ofEpochMilli() 方法将其转换为 LocalDateTime 类。

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class MillisToLocalDateTimeExample {
    public static void main(String[] args) {
        long millis = System.currentTimeMillis();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(
                Instant.ofEpochMilli(millis), ZoneId.systemDefault());

        System.out.println("Millis: " + millis);
        System.out.println("LocalDateTime: " + localDateTime);
    }
}

运行结果如下:

Millis: 1624701977799
LocalDateTime: 2021-06-26T15:26:17.799

通过使用 Instant.ofEpochMilli() 方法和 LocalDateTime.ofInstant() 方法,我们可以将毫秒数转换为 LocalDateTime 类。

4. 通过 SimpleDateFormat 格式化

java.text.SimpleDateFormat 是一个常用的日期格式化工具类,我们可以使用它将 Date 类转换为字符串格式,再通过 java.time.LocalDateTime.parse() 方法将其转换为 LocalDateTime 类。

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class SimpleDateFormatExample {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        try {
            String dateString = sdf.format(new Date());
            LocalDateTime localDateTime = LocalDateTime.parse(dateString, dtf);

            System.out.println("Date: " + dateString);
            System.out.println("LocalDateTime: " + localDateTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:

Date: 2021-06-26 15:54:55
LocalDateTime: 2021-06-26T15:54:55

通过使用 SimpleDateFormat 类格式化日期,并配合 DateTimeFormatter 类将格式化后的字符串转换为 LocalDateTime 类。

5. 通过 Calendar 类

在 Java 8 之前,我们可以使用 java.util.Calendar 类来进行日期和时间的操作。通过将 Date 类转换为 Calendar 类,我们可以方便地将其转换为 LocalDateTime 类。

import java.util.Calendar;
import java.util.Date;
import java.time.LocalDateTime;

public class CalendarExample {
    public static void main(String[] args) {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);

        LocalDateTime localDateTime = LocalDateTime.of(year, month, day, hour, minute, second);

        System.out.println("Date: " + date);
        System.out.println("LocalDateTime: " + localDateTime);
    }
}

运行结果如下:

Date: Sat Jun 26 16:15:21 CST 2021
LocalDateTime: 2021-06-26T16:15:21

通过使用 Calendar 类提取 Date 类中的年、月、日、时、分、秒等字段,并将其转换为 LocalDateTime 类。

6. 通过 Joda-Time 库

在 Java 8 之前,我们可以使用第三方的 Joda-Time 库来进行日期和时间的操作。Joda-Time 提供了丰富的日期和时间类,包括 org.joda.time.DateTimeorg.joda.time.LocalDateTime。通过转换,我们可以将 java.util.Date 转换为 Joda-Time 的日期和时间类,再将其转换为 java.time.LocalDateTime 类。

请注意,在 Java 8 中已经有了内置的日期和时间类,因此使用 Joda-Time 库已不再推荐。

import org.joda.time.DateTime;
import org.joda.time.LocalDateTime;

public class JodaTimeExample {
    public static void main(String[] args) {
        DateTime dateTime = new DateTime(new Date());
        LocalDateTime localDateTime = LocalDateTime.fromDateFields(dateTime.toDate());

        System.out.println("DateTime: " + dateTime);
        System.out.println("LocalDateTime: " + localDateTime);
    }
}

运行结果如下:

DateTime: 2021-06-26T16:35:54.331+08:00
LocalDateTime: 2021-06-26T16:35:54.331

通过将 Date 类转换为 Joda-Time 的日期和时间类,并将其转换为 java.time.LocalDateTime 类。

7. 总结

本文从多个方面详解了如何将 java.util.Date 转换为 java.time.LocalDateTime。通过使用 toInstant() 方法、Instant.ofEpochMilli() 方法、SimpleDateFormat 类、Calendar 类等方式,我们可以在 Java 开发中灵活地处理日期和时间的转换操作。

总之,在日常开发中,尽可能使用新的日期和时间类来处理日期和时间,避免使用过时的 java.util.Date 类。通过掌握本文提到的几种日期转换方法,我们可以更加高效地处理日期和时间相关的问题。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程