@
nothingistrue 扯远了。
回到用 long 存时间戳的问题上,假如现在有一台 MySQL (无论在哪儿),Java 程序 1 在北京,Java 程序 2 在纽约,它们都连接着这个数据库。
实验 1:
先是北京产生了一条记录,然后 10 分钟后纽约产生了一条记录。Java 程序都使用 System.currentTimeMillis()将得到的 long 数字存入数据库。那么这两条记录差的大概就是 10*60*1000 毫秒。无论你是否设置了 serverTimezone 参数,可测试。
实验 2:
使用如下 Java 程序插入一条新纪录。
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC%2B8";
Connection conn = DriverManager.getConnection(url, "root", "password");
PreparedStatement stmt = conn.prepareStatement("INSERT INTO record(`time`) VALUES(?)");
Date date = new Date();
stmt.setObject(1, date);
stmt.execute();
stmt.close();
conn.close();
在保留和去除 serverTimezone=UTC%2B8 这个参数的情况下分别插入一条数据。那么你在数据库里看到的时间差别就很大。这是因为虽然 MySQL 底层虽然用了存整形的方法存时间戳。但你 insert 的时候仍然得用字符串:
INSERT INTO record(`time`) VALUES('2022-07-13 00:00:00')
这就有了借助时区的转换过程,然后就会有问题。