自学内容网 自学内容网

关于 TDengine 的时区(timeZone)问题

背景

在学习SagooIOT物联网平台使用docker部署TDengine时序数据库,根据时间戳(timestamp)ts查询上报设备数据时 发现结果跟查询条件不匹配。查询问题原因竟然是timezone时区设置问题。

查询数据结果:

查看容器时区:

docker exec -it 容器id /bin/bash

cat /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时区)。


原文地址:https://blog.csdn.net/AlinMa/article/details/137623589

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!