时区
时区
https://www.modb.pro/db/168851
时区的设置主要在两个地方,一个是 tdengine 服务端的时区设置,一个是客户端在连接服务端的时候的设置
服务端设置时区
修改 taos/taos.cfg
中的 timezone
配置,
show variables;
查看当前的时区信息。
可以看到 UTC-8
后面的括号里表示的是 UTC 时间 +8 个小时。UTC-8
跟在 Windows 上的 UTC+8
是一个意思
具体请看《Java 核心技术卷二 _ 第 6 章 _ 日期和时间 API.md》的
POSIX标准下的时区ID
客户端设置时区
TDengine 的客户端在写入时,如果 SQL 中是本地日期时间格式(即,没有带时区信息,一般都是时间字符串),则使用当前配置的 timezone 配置,将 SQL 中的日期时间转换为 timestamp;在查询的时候,客户端也会根据时区配置格式化服务端返回的时间戳。
同时,也支持使用 RFC-3339 格式的日期时间进行写入;RFC-3339 格式的日期时间是带时区信息的
如果在 insert 语句中,用一个 String 表示日期时间,插入到 TDengine,存在着将这个 String 解析成 timestamp 的过程。这个 String 存在不同的格式,合法的格式包括:
-
RFC 3339 标准的表示方式,例如
2019-10-12T07:20:50+00:00
或2019-10-12T15:20:50+08:00
-
yyyy-MM-dd hh:mm:ss,例如
2021-07-21 12:00:00.00
在使用 JDBC Connector 连接 TDengine 时,可以通过 2 个途径设置 timezone 参数,分别为:url、properties
url:
DriverManager.getConnection("jdbc:TAOS://taosdemo.com:6030/test?timezone=UTC-8", "root", "taosdata");
properties:
@Bean(name = "dataSource", destroyMethod = "close")
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.taosdata.jdbc.rs.RestfulDriver");
// jdbc:TAOS-RS://10.8.65.169:6041/server_node_base
druidDataSource.setUrl("jdbc:TAOS-RS://localhost:6041/server_node_base?user=root&password=taosdata");
Properties connProps = new Properties();
connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "zh_CN.UTF-8");
// 设置时区
connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
druidDataSource.setConnectProperties(connProps);
return druidDataSource;
}
不设置时区
当然,你也可以不设置时区,在插入和查询的时候均直接使用时间戳,TDEngine 也支持直接使用时间戳查询
比如东八区的 "2023-11-25 11:24:28",等同于 1700882668000
select * from nodeonline where ts > '2023-11-25 11:24:28' ;
等同于
select * from nodeonline where ts > 1700882668000 ;
docker 安装的时候设置时区
这个好像没有给参数,TODO
这个官方页面里都没有支持时区这个参数。
不过一般我们也都是将 taos.cfg
映射出来放到宿主机,我们直接改这个文件即可