如何更新lua中的时间以反映执行过程中系统时区的变化?

2024-04-15

Problem

我想修改awful.widget.textclockAwesome-wm 中的小部件可以立即反映系统时区的更改。这个小部件和所有的 Awesome-wm 配置都是用 lua 编写的。

目前,如果系统时区发生更改,小部件将继续根据运行时设置的时区显示时间。该小部件使用os.time函数检索时间,但这与系统时间不匹配。


解决方案如下

lua脚本:

local tz=require"luatz";

require "luatz.tzcache".clear_tz_cache()
print("Before Changes (America/Los_Angeles)")
print(os.date("!%H:%M",tz.time_in()))

os.execute("timedatectl set-timezone America/Chicago")

require "luatz.tzcache".clear_tz_cache()
print("America/Chicago")
print(os.date("!%H:%M",tz.time_in()))

os.execute("timedatectl set-timezone America/New_York")
require "luatz.tzcache".clear_tz_cache()

print("America/New_York")
print(os.date("!%H:%M",tz.time_in()))

Output:

Before Changes (America/Los_Angeles)
15:33
America/Chicago
17:33
America/New_York
18:33

解决方法

这可以通过重新启动很棒的窗口管理器来解决,这会导致小部件再次获得正确的时区。当然,如果时区发生变化,则需要再次重新启动窗口管理器。

期望的效果是在时区发生变化时从系统更新时区,无论是定期还是每次os.time函数被调用。


Use Case

如果您好奇,它的用例是在笔记本电脑上。我经常旅行和跑步tzupdate on a systemd timer。我想自动更改我的时区。这工作得很好,只是实际显示时间的小部件没有注意到系统时区的变化。


到目前为止尝试过

  1. 取消设置“$TZ”环境变量。但 Arch Linux 从一开始就没有设置这个变量,所以我不确定 lua 是如何确定正确的时区的。
  2. Use the luatz图书馆,特别是tzcache.clear_tz_cache()功能。这似乎没有效果。
  3. 使用以下函数检索系统时间os.time(): luatz.time() and luatz.gettime.gettime()。这些函数与其他函数检索相同的时间。
  4. Use the luatz.time_in()函数,但这会返回对 UTC 时间应用两次时区偏移的时间。luatz.time()返回正确的本地时间,但应该返回 UTC 时间。

UPDATED luatz

我尝试搞乱luatz按照推荐的库,但它似乎没有重新检查系统时区,即使在调用tzcache.clear_tz_cache()功能。

我克隆了luatz回购并复制luatz到系统模块目录。该脚本似乎正确加载,但没有改变忽略系统时区更改的效果。据我所知,这与os.time()功能。

luatz测试脚本:

local luatz = require "luatz"
local tzcache = require "luatz.tzcache"
local gettime = require "luatz.gettime"

print ("\nBefore Change - System TZ is ")
os.execute("timedatectl | grep 'Time zone' | awk '{ print $3 }'")
print("\nos.time(): "..os.date("%H:%M", os.time()))
print("luatz.time(): "..os.date("%H:%M", luatz.time()))
print("gettime..gettime(): "..os.date("%H:%M", gettime.gettime()))

print("\nTime zone changed to America/New_York")
os.execute("timedatectl set-timezone America/New_York")

tzcache.clear_tz_cache()

print ("\nAfter  Change - System TZ is ")
os.execute("timedatectl | grep 'Time zone' | awk '{ print $3 }'")
print ("\nos.time(): "..os.date("%H:%M", os.time()))
print ("luatz.time(): "..os.date("%H:%M", luatz.time()))
print("gettime.gettime(): "..os.date("%H:%M", gettime.gettime()))

Output:

Before Change - System TZ is 
America/Los_Angeles

os.time(): 11:54
luatz.time(): 11:54
gettime..gettime(): 11:54

Time zone changed to America/New_York

After  Change - System TZ is 
America/New_York

os.time(): 11:54
luatz.time(): 11:54
gettime.gettime(): 11:54

luatz.time_in()

So the luatz.time_in()函数确实会随着系统时区的变化而更新,我对此感到兴奋!然而,time_in()不显示正确的当地时间。它将时区偏移添加到正确的当地时间,导致时间晚了几个小时。我尝试设置TZ环境变量,但这没有效果。因为某些原因,luatz.time()正在返回当地时间并且luatz.time_in()返回应用时区偏移两次的结果。

lua脚本:

local tz=require"luatz";

require "luatz.tzcache".clear_tz_cache()
print("Before Changes (America/Los_Angeles)")
print(os.date("%H:%M",tz.time_in()))

os.execute("timedatectl set-timezone America/Chicago")

require "luatz.tzcache".clear_tz_cache()
print("America/Chicago")
print(os.date("%H:%M",tz.time_in()))

os.execute("timedatectl set-timezone America/New_York")
require "luatz.tzcache".clear_tz_cache()

print("America/New_York")
print(os.date("%H:%M",tz.time_in()))

output:

Before Changes (America/Los_Angeles)
08:59
America/Chicago
10:59
America/New_York
11:59

实际系统当地时间:15:59.


背后的底层函数os.date http://www.lua.org/source/5.2/loslib.c.html#os_date, localtime(3) http://linux.die.net/man/3/localtime“就像它调用了一样tzset(3) http://linux.die.net/man/3/tzset", tzset使用环境变量TZ确定时区,如果不存在,则读取/etc/localtime.

环境变量主要是在程序启动之前确定的,因此,为了使时区发生更改,您可以找到一种方法来设置TZ多变的。 Aos.setenv可以通过一些 lua 库获得,例如lua-ex http://lua-users.org/wiki/ExtensionProposal

如果这看起来不是一个合理的行动方案,您也许可以确保您的脚本在没有TZ完全设定;这将迫使tzset从中读取/etc/localtime。不幸的是,大多数时候这个文件被缓存,你不会得到更新;这取决于您的系统。

或者,您可以使用不同的库来获取时间,而不是os图书馆。在luatz https://github.com/daurnimator/luatz你可以清除它的时区缓存require "luatz.tzcache".clear_tz_cache(),您可以在获取时间之前调用此函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更新lua中的时间以反映执行过程中系统时区的变化? 的相关文章

  • Lua中如何对数字表求和?

    Lua有内置的吗sum 功能 我似乎找不到一个 我几乎翻遍了文档中的所有地方 或许table sum 或类似的东西 以遵循当前的约定 但由于我找不到它 我不得不实现它 function sum t local sum 0 for k v i
  • 我应该用 C++ 封装 Lua 代码的哪些代码?

    我终于将 LuaBind 配置为与我的 C 项目一起使用 我最近发现 Tiled 地图编辑器可以选择将文件导出为 lua 所以我想尝试一下 我将使用什么代码来封装下面粘贴的代码以使其与我的 C RPG 项目一起使用 return versi
  • 使用 corona sdk 验证电子邮件地址

    在我的项目中 有一个供用户填写详细信息的表单 其中有一个文本字段用于输入用户的电子邮件 ID 所以我需要在 corona 项目中验证该文本字段中的电子邮件 试试这个正则表达式 local email email protected cdn
  • 如何解密Lua字节码?

    早上好 我正在尝试破译 Moon 字节码 但我无法以任何方式 有人可以帮助我吗 我有这个 例如 code 27 76 117 97 81 0 1 4 4 4 8 0 如何将此字节码解密为文本 我已经在这里搜索 http www asciit
  • 获取以 UTC 表示的当前时间的最简单 PowerShell 方法

    我已查看该帖子在 PowerShell 中创建具有特定 UTC 日期时间的 DateTime 对象 https stackoverflow com questions 10487011 creating a datetime object
  • lua_resume 的 from 参数的含义

    From Lua 5 2 参考手册 http www lua org manual 5 2 manual html lua resume int lua resume lua State L lua State from int nargs
  • 什么时候适合使用Lua这样的嵌入式脚本语言

    我玩 魔兽世界 大约有两年了 我对用来编写插件的 Lua 很好奇 由于到目前为止我读到的有关 Lua 的内容都是 快 轻 和 这太棒了 所以我想知道如何以及何时使用它 您需要在系统中嵌入像 Lua 这样的脚本语言的典型情况是什么 当您需要最
  • Lua :: 如何编写加载多个CPU的简单程序?

    我还无法用 Lua 编写一个可以加载多个 CPU 的程序 自从Lua通过协程支持这个概念 http www lua org pil 9 4 html 我相信这是可以实现的 我失败的原因可能是以下之一 这在Lua中是不可能的 我写不出来 an
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • 提供带有偏移量的日期字符串(+0530)与在显示名称中单独指定时区(亚洲/加尔各答)

    提供带有偏移值的日期字符串有什么好处 例如 0530 而不是单独指定其时区作为 TimeZone 显示名称 例如Asia Calcutta Summary 偏移量准确地告诉您相对于 UTC 的日期和时间 因此它是明确的 时区会告诉您该日期遵
  • c/c++ strptime() 不解析 %Z 时区名称

    我是 C 语言的新手 当我练习 C 语言时 我会花时间来回构建 tm 我注意到一些不同 请告诉我我做错了什么 include
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • 如何在 Javascript 中获取时区名称(PDT、EST 等)? [复制]

    这个问题在这里已经有答案了 使用 Javascript 有没有办法根据用户的设备获取用户的时区名称 PDT EST 等 我尝试过的代码 const timezone jstz determine const userTimezone tim
  • 时间戳相减必须具有相同的时区或没有时区,但它们都是 UTC

    有一些问题解决了相同的错误TypeError Timestamp subtraction must have the same timezones or no timezones但没有一个面临与此相同的问题 我有 2 个 UTC 时间戳 在
  • 如何使用 srlua 制作可执行的 Lua 脚本?

    我的主要目标是使我的 lua 文件成为可执行文件或使其成为咬代码 最好是两者皆有 我正在尝试 srlua 但在自述文件中它告诉我要做的事情 对于Windows 您需要首先创建srlua exe和glue exe 然后为每个 你想把Lua程序
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • Lua 访问表的键和值

    我想在关卡编辑器中读取 Lua 文件 这样我就可以以可视化格式显示其数据供用户编辑 如果我有一个像这样的 Lua 表 properties Speed 10 TurnSpeed 5 Speed显然是关键并且10价值 我知道如果我知道像这样的
  • Chrome JavaScript 日期构造函数获取 1884 年之前的日期似乎是错误的

    如果我将 1 1 1753 午夜 的 unix 毫秒时间戳值 6847786800000 传递给 Chrome 中的 JavaScript Date 构造函数 则 Chrome 给出的日期看起来非常奇怪 当我使用带有七个参数的 Date 构
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute

随机推荐