一、Java Date和LocalDateTime的概念
Java中的Date類是用於表示日期和時間的類。它封裝了從1970年1月1日0時0分0秒(GMT)起經過的毫秒數。而LocalDateTime類是Java 8新引入的日期時間API中的一個類,它表示一個不可變的日期時間對象。它與Date類最大的不同是,它沒有時區信息,因此也沒有對應的偏移量。
需要注意的是,Java 中的Date類已經在Java 8之後變為了過時標註(deprecated),建議使用Java 8中提供的日期時間API替代。但是,由於歷史原因,Date類仍然會在許多現有代碼中使用,因此轉換為LocalDateTime的需求也伴隨着它。
二、Java Date轉LocalDateTime的方法
1. Date實例直接轉LocalDateTime
Java 8的日期時間API中提供了許多方法來完成Date類到LocalDateTime類的轉換。使用DateTimeFormatter格式化Date的日期時間格式並調用LocalDateTime的parse方法,即可完成轉換。
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class DateToLocalDateTime {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//將Date格式化為字符串,因為LocalDateTime的parse方法需要字符串作為參數
String dateString = sdf.format(new Date());
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//調用LocalDateTime的parse方法,將字符串轉為LocalDateTime實例
LocalDateTime ldt = LocalDateTime.parse(dateString, dtf);
System.out.println("Date轉LocalDateTime:" + ldt);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. Calendar實例轉LocalDateTime
同樣是使用DateTimeFormatter格式化Calendar的日期時間格式,再調用LocalDateTime的parse方法,就可以將Calendar實例轉為LocalDateTime實例。
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
public class CalendarToLocalDateTime {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
try {
//將Calendar格式化為字符串,因為LocalDateTime的parse方法需要字符串作為參數
String dateString = sdf.format(cal.getTime());
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//調用LocalDateTime的parse方法,將字符串轉為LocalDateTime實例
LocalDateTime ldt = LocalDateTime.parse(dateString, dtf);
System.out.println("Calendar轉LocalDateTime:" + ldt);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. Date實例使用Instant中間轉換為LocalDateTime
使用Instant的ofEpochMilli方法將日期轉為Instant實例,再使用atZone方法將它轉為ZoneId實例。最後,使用LocalDateTime的ofInstant方法將Instant轉為LocalDateTime,即可完成Date到LocalDateTime的轉換。
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
public class DateToLocalDateTimeWithInstant {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//將Date轉為毫秒數,作為Instant的參數
Instant instant = Instant.ofEpochMilli(new Date().getTime());
//使用系統默認時區,將Instant轉為ZoneId
ZoneId zoneId = ZoneId.systemDefault();
//使用LocalDateTime的ofInstant方法,將Instant轉為LocalDateTime
LocalDateTime ldt = LocalDateTime.ofInstant(instant, zoneId);
System.out.println("Date使用Instant轉LocalDateTime:" + ldt);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. Calendar實例使用Instant中間轉換為LocalDateTime
同樣適用於Calendar實例。唯一的區別在於要使用Calendar的getTimeInMillis方法來將Calendar轉為毫秒數,作為Instant的參數。
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
public class CalendarToLocalDateTimeWithInstant {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Calendar cal = Calendar.getInstance();
//將Calendar轉為毫秒數,作為Instant的參數
Instant instant = Instant.ofEpochMilli(cal.getTimeInMillis());
//使用系統默認時區,將Instant轉為ZoneId
ZoneId zoneId = ZoneId.systemDefault();
//使用LocalDateTime的ofInstant方法,將Instant轉為LocalDateTime
LocalDateTime ldt = LocalDateTime.ofInstant(instant, zoneId);
System.out.println("Calendar使用Instant轉LocalDateTime:" + ldt);
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、總結
Java日期和時間的處理歷來是一個比較複雜的問題,在Java 8之前,Date類是用來處理時間的,它存在日期和時間混合在一起的問題和時區轉換的問題。Java 8引入了新的日期時間API,這個API使日期和時間的處理變得更加簡單。通過上述代碼演示的四種方法,可以把Java Date或Calendar對象轉換為LocalDateTime對象,同時保證時區正確。
在實際應用中,開發者需要根據項目的實際情況選擇最合適的方法進行轉換,同時需要特別注意Java 8中日期時間API的格式化和解析方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/307026.html
微信掃一掃
支付寶掃一掃