- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想修改 awesome-wm 中的 awful.widget.textclock
小部件以立即反射(reflect)系统时区的变化。这个小部件和所有 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()))
输出:
Before Changes (America/Los_Angeles)
15:33
America/Chicago
17:33
America/New_York
18:33
这可以通过重新启动 awesome 窗口管理器来解决,这会导致小部件再次获得正确的时区。当然,如果时区发生变化,则需要再次重新启动窗口管理器。
期望的效果是在系统更改时更新时区,可以是定期更新,也可以是每次调用 os.time
函数时更新。
如果您好奇的话,这个用例是在笔记本电脑上。我经常出差并在 systemd timer
上运行 tzupdate
。我想自动更改我的时区。这工作正常,只是实际显示时间的小部件没有注意到系统时区的变化。
luatz
库,特别是tzcache.clear_tz_cache()
函数。这似乎没有效果。os.time()
以外的函数获取系统时间:luatz.time()
和 luatz.gettime.gettime()
。这些函数与其他函数同时检索。luatz.time_in()
函数,但这会返回时区偏移应用两次 UTC 时间的时间。 luatz.time()
返回正确的本地时间,但应该返回 UTC 时间。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()))
输出:
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()
所以 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()))
输出:
Before Changes (America/Los_Angeles)
08:59
America/Chicago
10:59
America/New_York
11:59
实际系统本地时间:15:59
。
最佳答案
os.date
背后的底层函数, localtime(3)
“就像它调用了 tzset(3)
一样,tzset
使用环境变量 TZ
来确定时区,如果不存在,则从 /中读取etc/localtime
.
环境变量主要是在您的程序启动之前确定的,因此,要让您的时区发生变化,您可以找到一种方法来设置您的 TZ
变量。 os.setenv
可通过一些 lua 库获得,例如lua-ex
如果这似乎不是一个合理的行动方案,您也许可以确保您的脚本在根本没有设置 TZ
的情况下启动;这将强制 tzset
从 /etc/localtime
读取。可悲的是,大多数时候这个文件都被缓存了,你不会得到更新;这取决于您的系统。
或者,您可以使用不同的库来获取时间,而不是 os
库。在 luatz
您可以使用 require "luatz.tzcache".clear_tz_cache()
清除它的时区缓存,您可以在获取时间之前调用此函数。
关于lua - 如何更新lua中的时间以反射(reflect)执行期间系统时区的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25212106/
在我的 Rails (3.0) 应用程序中,我使用助手 time_zone_select() 来使用时区。它生成时区名称,如“(GMT+01:00) Paris”... 但这些名称与 MySQL 中的
我正在解析格式为的日期: SimpleDateFormat formatter = new SimpleDateFormat("EE MMM dd HH:mm:ss Z yyyy"); 当我这样做的时
我在 Android 上使用 ACTION_TIMEZONE_CHANGED Intent 过滤器来响应时区更改。 我注意到 Jodas 当前时区此时没有更新,使用:DateTimeZone.getD
我有一个旧版 Windows 应用程序,它从数据库读取数据。其中一列是“TimeZoneInfoId”。在传统世界中,它是由另一个 Windows 应用程序编写的,因此它存储 Windows 字符串:
我是数据库开发新手,目前从事 MySQL 工作。我有一列包含美国的所有时区。我希望能够获取每行中每个时区的当前时间(只有时间,没有日期)。 时区数据如下:+05:00、-03:00 等等 这就是我尝试
我正在尝试了解 session 时区在 PostgreSQL 中的工作原理。 当我将 session 时区设置为“01:00”时,返回日期为“-01:00”。符号总是颠倒的,我不理解这种行为。 这怎么
我写入我的 mongoDB 数据库,例如开始日期,开始日期始终是一周中的星期一(我使用并且我在欧洲中部时区)。 "startDate" : ISODate("2014-12-28T23:00:00Z"
是否有详尽的 MySQL 时区列表? 似乎 MySQL 设置中 time_zone 的有效值取决于主机操作系统,但我一直无法找到可能值的列表。 我需要时间显示卡尔加里本地时间。 最佳答案 默认情况下,
我已经在 config/app.php 中配置了时区至 Europe/Lisbon . 如果我做 return date_default_timezone_get(); , 返回 Europe/Lis
我在整个脚本中广泛使用 unix 时间,通常我将时区设置如下: date_default_timezone_set('Europe/London'); 这一直工作正常,直到上周末时钟回退一个小时,我怀
我有一个字符串,2013-10-07T23:59:51.205-07:00,想将其转换为 Java 日期对象。我收到解析错误。 date = new SimpleDateFormat("yyyy-MM
如何更改日志文件名中的 log4j 时区? 我的 log4j.xml 文件:
在JAVA中,如何确定所有日期都作为GMT日期返回? 例如,即使我尝试使用GMT语言环境强制使用DateFormat,它也会应用某种逻辑来检索BST日期。 public static void mai
好吧,这是我遇到过的最奇怪的错误之一! 首先:我不是 Python 程序员,该脚本是由 friend 编写的(我认为他的大部分内容来自示例)。 该脚本的用途:将日历信息(CET 时间)从 XML 文件
我们有一个网站,目前在某个时间(由用户选择)运行拍卖,这一切都工作正常,因为当服务器到达该时间时,拍卖就会开始。然后我们必须添加时区,具体取决于用户居住的地方。然后,根据所选的下拉菜单,这将增加或减少
我陷入了这个逻辑。我正在开发一个消息调度项目,我的客户来自不同的国家。让我们考虑一下亚洲(不遵守夏令时)和美国/纽约(遵守夏令时)。 现在,我正在编写以下查询来获取距当前时间 10 分钟间隔内的时间表
我尝试返回特定时区的值,但我遇到了一些奇怪的响应行为: SELECT created_at AT TIME ZONE 'US/Pacific' - created_at, NOW() A
我正在尝试将不带时区值(例如“31.05.2015”)的字符串转换为 NSDate。 我的 DateFormatter 有什么问题?它返回日期 2015-05-31 22:00:00 +0000当我尝
我已经成功地将我的本地 tzinfo 导入到 mysql 中,我几乎已经了解了关于如何存储和使用这些数据的所有细节,除了一个字段。有一个名为 Transition_type_id 的数字字段(在表 t
为什么以下行返回的 TimeZone 显示不正确的时间: TimeZone.getTimeZone("America/Ottawa") 现在显示晚上 10:26 [亚特兰大时间现在是 6:26,Ott
我是一名优秀的程序员,十分优秀!