取得「今天零點零分零秒」的 java.sql.Timestamp,常用於資料庫日期範圍查詢(如 WHERE create_time >= ?)。
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
public class Test {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long t = System.currentTimeMillis();
// 做法 1:直接對 86400000 取餘數 → 得到 GMT 00:00:00
t = t / (1000 * 3600 * 24) * (1000 * 3600 * 24);
System.out.println("GMT 零點:" + sdf.format(new Timestamp(t)));
// 做法 2:再扣掉本地時區偏移 → 得到本地 00:00:00
t = System.currentTimeMillis();
t = t / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();
System.out.println("本地零點:" + sdf.format(new Timestamp(t)));
}
}
GMT 零點:2024-01-15 00:00:00
本地零點:2024-01-15 00:00:00
乍看相同,實則內部毫秒值不同:
| 做法 | 毫秒值基準 | 適用場景 | 風險 |
|---|---|---|---|
| 僅除以 86400000 | UTC 零點 | 資料庫儲存 UTC 時間、跨時區系統 | 若資料庫用本地時間,查詢會偏移 8 小時 |
再扣 getRawOffset() | 本地零點 | 資料庫儲存本地時間、單時區系統 | 夏令時間未處理(getRawOffset 不含 DST) |