『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 339|回复: 6

[技术探讨] 求助:timestamp_custom()函数

[复制链接]

1

主题

11

帖子

84

积分

注册会员

Rank: 2

积分
84
金钱
73
HASS币
0
发表于 2024-8-1 21:42:48 | 显示全部楼层 |阅读模式
本帖最后由 lqian889 于 2024-8-2 22:49 编辑

路由器,有个实体,开机至当前时间路由器运行了多长时间(时间单位:秒),假设,开机运行了3661秒
state: "{{ (3661-28800) | int | timestamp_custom('%j 天 %H 小时 %M 分钟 %S 秒') }}"
输出值: 1天 1小时 1分钟 1秒

多了1天时间,捣鼓了很长时间,未解。是何问题?



------------------  分割线 1 ------------------


捣鼓了一天,根据查到的资料,timestamp_custom()函数有个布尔值,默认为 trueUTC时间,false 为取当前时区的值

下面为修改后的代码:
state: "{{ (1) | int | timestamp_custom('%j 天 %H 小时 %M 分钟 %S 秒',false) }

输出值: 1天 0小时 0分钟 1秒

state: "{{ (-1) | int | timestamp_custom('%j 天 %H 小时 %M 分钟 %S 秒',false) }}"
输出值: 365天 23小时 59分钟 59秒

state: "{{ (3661) | int | timestamp_custom('%j 天 %H 小时 %M 分钟 %S 秒',false) }}"
输出值: 1天 1小时 1分钟 1秒


还是无法解决多出来1天的问题,感觉这个函数很妖娆,莫名其妙多出来1天时间。


------------------  分割线 2 ------------------

这是网上抄的作业
- name: "ios_system_uptime"
   unique_id: ios_system_uptime # HA中的实体
   state: >
     {% set uptime = 24*60*60 + 3600 + 120  %}
     {% set years = uptime // 31536000 %}
     {% set months = (uptime % 31536000) // 2592000 %}
     {% set days = (uptime % 2592000) // 86400 %}
     {% set hours = (uptime % 86400) // 3600 %}
     {% set minutes = (uptime % 3600) // 60 %}
     {{ '%dy ' % years if years else '' }}{{ '%dm ' % months if months else '' }}{{ '%d天 ' % days if days else '' }}{{ '%d小时 ' % hours if hours else '' }}{{ '%d分钟' % minutes if minutes else '' }}

输出值:1天 1小时 2分钟
完美!!!



------------------  分割线 3 ------------------
感谢6楼的网友提供的代码:

{{timedelta(seconds = 366100)}}
输出值:4 days, 5:41:40












回复

使用道具 举报

10

主题

1282

帖子

4049

积分

论坛元老

Rank: 8Rank: 8

积分
4049
金钱
2767
HASS币
0
发表于 2024-8-1 22:26:29 | 显示全部楼层
gpt3.5是这么回答的:仅供参考
问题出在时间的偏移计算上。你的模板中减去了28800秒,这可能是因为你的系统处于某个特定的时区,比如UTC+8时区(东八区,中国标准时间)。通常,我们在计算运行时间时需要考虑到系统的时区偏移。

假设你的路由器的运行时间是3661秒,这表示它已经运行了3661秒。但是,你减去了28800秒,这个值是8小时(28800秒),因为中国处于UTC+8时区,而你的模板似乎是在假设UTC时间基础上计算。

为了正确计算从开机到当前时间的运行时间,需要考虑以下几点:

UTC偏移: 如果你的Home Assistant配置使用了UTC时间或者默认的时间戳,需要考虑你所在的时区偏移量。在UTC+8时区,你需要减去28800秒(8小时)来转换为本地时间。

模板调整: 确保你的模板正确处理了UTC偏移或者本地时区偏移。可以使用Home Assistant的now()函数来获取当前本地时间,然后计算开机时间到当前时间的差异。

下面是一个调整后的模板示例,假设你的路由器已经运行了3661秒(假设此时你是在UTC+8时区):

state: "{{ (now().timestamp() - 3661) | int | timestamp_custom('%j 天 %H 小时 %M 分钟 %S 秒') }}"
这个模板会根据当前本地时间计算出路由器从开机到当前时间的运行时间,不需要手动减去任何偏移量。确保你的Home Assistant配置中的时区设置正确,以便正确计算时间。
state: "{{ (now().timestamp() - 3661) | int | timestamp_custom('%j 天 %H 小时 %M 分钟 %S 秒') }}"
回复

使用道具 举报

1

主题

11

帖子

84

积分

注册会员

Rank: 2

积分
84
金钱
73
HASS币
0
 楼主| 发表于 2024-8-1 22:48:42 | 显示全部楼层
感谢,Home Assistant配置中的时区配置是正确的,上面的代码运行后显示  214天 21小时 42分钟 59秒

qqq.png
回复

使用道具 举报

1

主题

11

帖子

84

积分

注册会员

Rank: 2

积分
84
金钱
73
HASS币
0
 楼主| 发表于 2024-8-1 22:53:56 | 显示全部楼层
按理,有个值(比如3600秒)就能计算时间是1小时,应该与时区没关系,只是找不到 timestamp_custom()函数的参数说明,只能瞎子摸象了
回复

使用道具 举报

135

主题

2093

帖子

6471

积分

元老级技术达人

积分
6471
金钱
4373
HASS币
30
发表于 2024-8-2 12:36:17 | 显示全部楼层
我的理解也是,这种纯计算,跟时区没有关系,只是简单粗暴的把多少秒转换成天时分秒,你要 timestamp_custom()函数的说明,不同编程语言,转换方式不一样
回复

使用道具 举报

0

主题

15

帖子

235

积分

中级会员

Rank: 3Rank: 3

积分
235
金钱
220
HASS币
0
发表于 2024-8-2 16:43:17 | 显示全部楼层
{{timedelta(seconds = 366100)}} //4 days, 5:41:40
回复

使用道具 举报

1

主题

11

帖子

84

积分

注册会员

Rank: 2

积分
84
金钱
73
HASS币
0
 楼主| 发表于 2024-8-2 23:00:25 | 显示全部楼层
1楼已更新,继续求 timestamp_custom()函数代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-9-21 11:21 , Processed in 0.109767 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表