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.DateTime
和 org.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
类。通过掌握本文提到的几种日期转换方法,我们可以更加高效地处理日期和时间相关的问题。