HOWTO · Java
用 Java 將字串轉換為時間戳
它顯示了四種在 Java 中將字串轉換為時間戳的方法
本頁內容
java.sql.Timestamp 表示具有秒的小數精度的日期與時間,常用於 JDBC。請依輸入格式選擇解析方式:SQL 樣式的日期時間可使用 Timestamp.valueOf();自訂日期時間格式可使用 DateTimeFormatter;只有日期的輸入則可使用 LocalDate。這些轉換無法得知輸入中未包含的時區。
使用 Timestamp.valueOf() 解析標準日期時間字串
對於 2024-06-15 14:30:00 這類字串,Timestamp.valueOf(String) 可直接解析 SQL 時間戳記格式。這個 API 接受 JDBC 時間戳記逸出格式的值,也允許包含可選的小數秒;它接受的格式不限於此處展示的整秒形式。如果輸入使用不同的欄位順序或分隔符號,請改用其他解析器。
執行這個範例:
import java.sql.Timestamp;
public class StringToTimestamp {
public static void main(String[] args) {
String input = "2024-06-15 14:30:00";
Timestamp timestamp = Timestamp.valueOf(input);
System.out.println(timestamp);
}
}
2024-06-15 14:30:00.0
輸出中的 .0 是秒的小數部分。API 會拒絕格式錯誤的值;請在應用程式邊界驗證外部輸入,並處理解析錯誤。
使用 DateTimeFormatter 解析自訂日期時間字串
如果值採用 15/06/2024 14:30:00 這類格式,請使用 DateTimeFormatter 將它解析為 LocalDateTime,再將該物件傳給 Timestamp.valueOf(LocalDateTime)。格式模式必須與輸入相符:dd/MM/uuuu 代表日、月、年,HH:mm:ss 則使用 24 小時制。LocalDateTime 本身不包含位移或時區,因此這種方式會保留當地時間的各欄位,但無法識別唯一的時間軸瞬間。
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class CustomTimestamp {
public static void main(String[] args) {
String input = "15/06/2024 14:30:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(input, formatter);
Timestamp timestamp = Timestamp.valueOf(localDateTime);
}
}
使用 SimpleDateFormat 將解析後的日期轉為 Timestamp
對於以 java.util.Date 為基礎的舊版程式碼,可使用 SimpleDateFormat 解析自訂格式。解析結果是 Date;getTime() 會傳回其紀元毫秒值,而 Timestamp 建構子可接受這個值。除非另行設定,SimpleDateFormat 會使用 JVM 的預設時區,而且預設採用寬鬆解析。若需要可預期的解讀方式,請明確設定時區與寬鬆解析行為。範例固定使用 UTC,並停用寬鬆解析。此 API 也具有可變狀態且不是執行緒安全的,因此不要讓多個執行緒同時共用同一個實例。
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class LegacyTimestamp {
public static void main(String[] args) throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
formatter.setLenient(false);
Date parsed = formatter.parse("15/06/2024 14:30:00");
Timestamp timestamp = new Timestamp(parsed.getTime());
}
}
使用 LocalDate.atStartOfDay() 將純日期字串轉為 Timestamp
純日期值沒有指定時間。請將它解析為 LocalDate,再使用 atStartOfDay() 選定午夜作為預期時間,並將產生的 LocalDateTime 轉換為 Timestamp。這樣會明確表達採用午夜的假設;輸入中原本沒有的時間不會因此被保留下來。
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class DateOnlyTimestamp {
public static void main(String[] args) {
LocalDate date = LocalDate.parse("2024-06-15");
LocalDateTime startOfDay = date.atStartOfDay();
Timestamp timestamp = Timestamp.valueOf(startOfDay);
}
}
如何選擇 LocalDateTime 或 Timestamp
如果值表示當地的日曆日期與時鐘時間,而應用程式目前不該指定時區,請使用 LocalDateTime。如果 JDBC 等 API 要求 java.sql.Timestamp,請使用 Timestamp;它可攜帶秒的小數精度,並透過毫秒值表示時間軸上的一個時間點。將 LocalDateTime 轉換為 Timestamp 時,會使用 JVM 的預設時區推導該毫秒值,因此在預設時區不同的電腦上,相同的當地日期時間欄位可能對應到不同的時間軸瞬間。
如果輸入包含位移或地區資訊,請先用可保留位移或時區的 java.time 型別解析並保留這些資訊,再轉換為時間軸瞬間或資料庫型別。Timestamp.valueOf() 和 LocalDateTime 都無法推斷傳送者原本預期的時區。資料庫欄位型別與 JDBC 驅動程式也可能套用各自的時區規則,因此請讓應用程式的儲存與讀取假設保持一致。