常见时区问题
1. 设置的时候 使用JVM+8区 转换为时间字符串
2. 读取的时候,客户端时区已经变化,但字符串不在变化导致展示问题
3. 发生问题前提:存储了时间字符串,使用事件字符串进行了比对,展示事件字符串
4. 解决方案:使用时间戳,前端根据时间戳进行转换,后端使用UTC时间
Linux 获取时区
# date -R
Tue, 12 Sep 2023 09:41:27 +0800
# date +"%Z %z"
CST +0800
JVM设置时区
启动添加参数:
# 去掉TZ环境变量影响
unset TZ
# TestTimeZone为java类
java -Duser.timezone=Asia/Shanghai TestTimeZone
环境变量设置:
export TZ=Asia/Shanghai
JVM时区参数:
user.timezone 没值则代表取操作系统的默认时区
代码中设置JVM时区
System.setProperty("user.timezone","Asia/Shanghai");
Spring格式化时间类型时区设置
# 配置文件
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
# 代码上设置
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdDate;
代码修改时区
Jvm中默认使用系统的时区:
TimeZone timeZone = TimeZone.getDefault();
设置时区为标准时区
TimeZone timeZone = TimeZone.getTimeZone("GMT+8");
获取地区时区:
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
使用:
import java.util.TimeZone;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
// 设置默认时区为 UTC+8
TimeZone.setDefault(TimeZone.getTimeZone("UTC+8"));
SpringApplication.run(MyApplication.class, args);
}
}
MySQL查询和设置时区
查看时区:
SELECT @@global.time_zone;
设置时区:
在Linux系统下,我们可以在/etc/my.cnf文件中添加如下内容:
[mysqld]
default-time-zone = '+8:00'
SQL中转换时区:
SELECT CONVERT_TZ('2021-07-01 12:00:00', '+00:00', '+08:00');