时区

时区

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 存在不同的格式,合法的格式包括:

在使用 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

Docker

这个官方页面里都没有支持时区这个参数。

不过一般我们也都是将 taos.cfg 映射出来放到宿主机,我们直接改这个文件即可