背景
在学习SagooIOT物联网平台使用docker部署TDengine时序数据库,根据时间戳(timestamp)ts查询上报设备数据时 发现结果跟查询条件不匹配。查询问题原因竟然是timezone时区设置问题。
查询数据结果:
查看容器时区:
docker exec -it 容器id /bin/bashcat /etc/timezone
Etc/UTC
在SagooIoT的docker-compase.yml文件中修改 TDengine容器的时区
version: '3'
services: tdengine: image: tdengine/tdengine:3.2.1.0 restart: always container_name: tdengine-server ports: - 6030:6030 - 6041:6041 environment: - TZ=Asia/Shanghai # 设置时区为上海,即UTC+8
如何设置tdengine 启动的docker容器 的时区为UTF+8
docker run -e TZ=Asia/Shanghai --name your_container_name -d your_image
修改为UTF+ 8时区之后,查询结果
学习参考物联网平台: SagooIoT;
项目地址:https://github.com/sagoo-cloud/sagooiot
TDengine
是一个高性能的物联网(IoT)、互联网 of Things (IoT)、工业互联网和时序数据平台。在时序数据库TDengine中,ts是表示时间戳(timestamp)的一个关键字,如果在使用 TDengine 查询数据时没有返回预期的结果,可能有以下原因:
1.时间戳格式:确保 ts
字段的格式与查询中使用的格式一致;
2.时区问题:时区设置不一致 导致查询不一致;
从TDengine官网描述:
可知根据ts作为时间条件的基本查询sql为
SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE '%nny' ORDER BY ts DESC;
了解几个名词:
1.本地日期时间
表示当地的日期时间。12:00是中午吃饭的时间,8:00是早上上班的时间,这是我们习惯的一种表示时间的方式,是不带时区信息的日期和时间,可以当成一个String。例如:2024-04-10 18:00:00.000,表示2024年4月10日晚18点,时间精度以毫秒记,这个日期时间的表示方法,不带任何时区信息
2.时区
地理概念,按照UTC/格林威治时区,把地球划分成向东和向西各12个时区,其中东12区和西12区是一个区。时区可以通过'Asia/shanghai'这样的'地区/城市'的方式表示,也可以用UTC偏移的方式表示。例如:UTC+8,代表东八区,当协调世界时(UTC)时间为凌晨2点的时候,当地的时间为2+8点,即早上10点;中国现时区使用UTC+8
3.时间戳
是机器存储和计算时间的方式。以Unix元年(UTC时区1970年1月1日0点0分0秒)开始经过的秒数计算,不同精度的计时方式,可以有不同的时间戳。例如:0,表示UTC时区1970年1月1日凌晨的时间
4.RFC 3339
一种表示日期时间的标准格式。RFC 3339是带时区信息的格式,即包含日期时间信息,也有时区信息。例如,以下两个时间在地球上是同一时刻:
2024-04-10T07:20:50+00:00,这个表示2024年04月10日,上午7点20分50秒(UTC+0时区),
2024-04-10T15:20:50+08:00,这个表示2024年04月10日,下午3点20分50秒(UTC+8时区)。