如何更新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中的时间以反映执行过程中系统时区的变化? 的相关文章

  • Python 中的 datetime.fromtimestamp(os.path.getctime()) 是否为我提供了时区感知值?

    我在 Python 3 4 中使用这样的调用 x datetime fromtimestamp os path getctime somefilename y datetime fromtimestamp os path getmtime
  • JavaScript 检查时区名称是否有效

    有没有一种方法可以在不使用外部库的情况下检查 JavaScript 中的时区名称是否有效 当用户在文本字段中输入时区名称时 我想验证时区是否有效 我知道我们可以使用时刻时区库轻松做到这一点 但我不想使用任何额外的库 我正在寻找纯 JavaS
  • 如何在 Lua - Lightroom 插件中使用 HMAC

    首先我要提的是我对 Lua 真的很陌生 如果你认为我的问题太愚蠢 请耐心等待 这是我的要求 我需要使用 HMAC sha256 进行 Lightroom 插件开发 因为我使用它是为了安全 我试图使用这个但没有运气https code goo
  • 在 Lua 中只归档一次

    我想知道是否有一种方法可以只执行一次 lua 文件 并且后续尝试执行该 lua 文件将导致无操作 我已经考虑过做一些类似于 C header 的 if else endif 技巧的事情 我想知道是否有一个标准方法来实现这一点 James w
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 如何从 Lua 内部运行另一个脚本?

    我需要从另一个 Lua 脚本中执行一个 Lua 脚本 有多少种方法 我该如何使用它们 通常您会使用以下内容 dofile filename lua 但你可以通过以下方式做到这一点require 很好 例子 foo lua io write
  • 从命令行运行 vlc 扩展

    我有一个用 Lua 编写的 vlc 扩展 我知道如何从 GUI 运行它 查看 gt 我的扩展 我想从命令行运行它 这样我就不需要每次都启动X 它还没有实施 查看门票 3883 https trac videolan org vlc tick
  • 如何从 Lua 字符串中删除所有特殊字符、标点符号和空格?

    在Lua中 我只能找到其他语言的示例 如何从字符串中删除所有标点符号 特殊字符和空格 所以 举例来说 s t r i p p e d会成为stripped In Lua 模式 https www lua org manual 5 3 man
  • Lua(命令行)执行后保持打开状态

    我已经广泛寻找这个但我似乎找不到它 有什么方法可以执行Lua通过双击脚本 在中执行它 Lua Command Line 并在执行后保持打开状态 例如 print Hello World 该代码可以编译并运行 但是如果我双击hello lua
  • 模式 ^u.meta(\.|$) 未按预期工作

    我有这个模式 u meta 预期行为 u meta 将匹配所有角色 例如 u meta u meta admin u meta admin system u meta 它不应该匹配如下所示的内容 u meta admin u meta ad
  • 如何按照最初给出的时区存储和显示日期?

    我有一台服务器正在从不同时区的客户端提供数据 数据源包含人物 他们的出生日期和其他事件日期 出于我们的目的 如果我们可以将日期存储为给我们的日期 那就很方便了 例如 如果客户位于加利福尼亚州 并且告诉我们该人的出生日期是 5 月 31 日
  • 具有系统时区设置与用户个人时区的 Django

    Django 处理每个用户不同时区的情况如何 理想情况下 我想在 UTC 时区运行服务器 例如 在settings py set TIME ZONE UTC 因此所有日期时间都以 UTC 形式存储在数据库中 像这样的东西this https
  • 如何使用 Torch7 进行预测

    我仍在熟悉 Torch 到目前为止一切顺利 然而 我遇到了一个死胡同 我不知道如何解决 如何让 Torch7 或更具体地说 dp 库 来评估单个输入并返回预测输出 这是我的设置 基本上是 dp 演示 require dp hyperpara
  • 在循环内部或外部声明本地更好吗? [复制]

    这个问题在这里已经有答案了 我习惯这样做 do local a for i 1 1000000 do a
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 在 Lua 中更改元表会破坏冒号运算符

    在学习Lua的过程中 我借用了一些代码here http lua users org wiki StringIndexing使用字符串索引 正是这样 getmetatable index function str i return stri
  • 从 UTC 转换为本地时区给出错误结果

    背景我需要将格式为 HH mm 的时间字符串从 UTC 转换为本地时区 例如 如果 UTC 时间为 09 00 则当地时间 斯德哥尔摩 欧洲 应提前两个小时 Problem当我将 09 00 UTC 转换为斯德哥尔摩 欧洲时间时 我得到 1
  • 如何在 Lua-C API 5.2 中创建类对象?

    我正在使用 Lua 封装 C 函数 使用 Lua 5 2 的 Lua C API include
  • 使用 luasocket smtp 和 ssl 发送电子邮件

    我一直在尝试使用帖子中描述的代码发送电子邮件 lua使用gmail账户发送邮件 https stackoverflow com questions 11070623 lua send mail with gmail account 代码由米

随机推荐