OnmyojiAutoScript
OnmyojiAutoScript copied to clipboard
时区识别问题
当前不足
由于时区不同的缘故,很多功能无法使用,比如逢魔之时
解决方案
对时间的判断函数里增加一个时区判断,然后转换成统一时间后进行判断
其他内容
No response
Alas 对底层的设计更加的优秀,包括说时区、多服务器、多语言、多客户端。 我在复制代码的时候直接把这部分扔掉了,如果需要加上,应该是按照最先的设计更好,不过忘记了那边是如何处理的
Alas 对底层的设计更加的优秀,包括说时区、多服务器、多语言、多客户端。 我在复制代码的时候直接把这部分扔掉了,如果需要加上,应该是按照最先的设计更好,不过忘记了那边是如何处理的
我尝试了使用 dateutil 来进行时区转换,可以做到将时间转换成国内时间从而满足代码的时间段判定。但是有个问题在于,如果时间段不符合,比如逢魔之时,会强制将代码的下次运行时间改到17:30之后,但是这个时间就是没有经过转换的。所以我在想,是否可以通过引入一个获取时间的函数,将所有的时间都通过这个函数来进行转换
你的理解是正确的,不过我们先看看先驱是怎么设计的,Alas中有
SERVER_TO_LANG = {
'cn': 'zh-CN',
'en': 'en-US',
'jp': 'ja-JP',
'tw': 'zh-TW',
}
LANG_TO_SERVER = {v: k for k, v in SERVER_TO_LANG.items()}
SERVER_TO_TIMEZONE = {
'cn': timedelta(hours=8),
'en': timedelta(hours=-7),
'jp': timedelta(hours=9),
'tw': timedelta(hours=8),
}
def server_timezone() -> timedelta:
return SERVER_TO_TIMEZONE.get(server_.server, SERVER_TO_TIMEZONE['cn'])
def server_time_offset() -> timedelta:
"""
To convert local time to server time:
server_time = local_time + server_time_offset()
To convert server time to local time:
local_time = server_time - server_time_offset()
"""
return datetime.now(timezone.utc).astimezone().utcoffset() - server_timezone()
感觉有点绕 server_time_offset()
后面的操作都是再减去时差偏移
想法应该是把本地时间映射到北京时间,以及北京时间 -> 本地时间。
def server_timezone() -> timedelta:
return timedelta(hours=8)
def server_time_offset() -> timedelta:
"""
To convert local time to server time:
server_time = local_time + server_time_offset()
To convert server time to local time:
local_time = server_time - server_time_offset()
"""
return datetime.now(timezone.utc).astimezone().utcoffset() - server_timezone()
_server_time_offset = server_time_offset()
def server2local(server_time: datetime) -> datetime:
return server_time + _server_time_offset
def local2server(local_time: datetime) -> datetime:
return local_time - _server_time_offset
给你参考一下,自己来提一个pr,毕竟只有你一个是倒时差的
+1,现在有两个倒时差的了
我也遇到这个时区问题了,这个方案用timedelta可能没法考虑到夏令时带来的变化,可以引入新的库pytz来做时区计算。不过我认为最好还是始终使用utc时间,然后在生成输出的时候再考虑时间转换。
def server_timezone() -> timedelta: return timedelta(hours=8) def server_time_offset() -> timedelta: """ To convert local time to server time: server_time = local_time + server_time_offset() To convert server time to local time: local_time = server_time - server_time_offset() """ return datetime.now(timezone.utc).astimezone().utcoffset() - server_timezone() _server_time_offset = server_time_offset() def server2local(server_time: datetime) -> datetime: return server_time + _server_time_offset def local2server(local_time: datetime) -> datetime: return local_time - _server_time_offset
给你参考一下,自己来提一个pr,毕竟只有你一个是倒时差的