我想将日志文件中的UTC时间戳与本地时间戳进行比较.在创建本地datetime对象时,我使用如下内容:
>>> local_time=datetime.datetime(2010, 4, 27, 12, 0, 0, 0,
tzinfo=pytz.timezone('Israel'))
Run Code Online (Sandbox Code Playgroud)
我想找到一个自动工具来取代tzinfo=pytz.timezone('Israel')当前的本地时区.
有任何想法吗?
是否有可能,如果是,如何获得datetime.timezone用于datetime.datetime.fromtimestamp()将POSIX时间戳(自纪元以来的秒数)转换为datetime对象的时区(即UTC偏移或具有该偏移的实例)?
datetime.datetime.fromtimestamp()将POSIX时间戳转换为天真datetime对象(即没有a tzinfo),但使用系统的语言环境将其调整为当地时区和当时生效的UTC偏移量.
例如,使用日期2008-12-27午夜UTC(自纪元以来40*356*86400秒):
>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)
datetime.datetime(2008, 12, 27, 1, 0)
Run Code Online (Sandbox Code Playgroud)
该时间戳datetime在早上1点被转换为对象(当时是在CET/CEST时区).100天后,这是结果:
>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)
datetime.datetime(2009, 4, 6, 2, 0)
Run Code Online (Sandbox Code Playgroud)
现在是凌晨2点.这是因为到那时,DST是活跃的.
我希望它datetime.datetime.fromtimestamp()会tzinfo在返回的datetime实例中设置它的用途,但事实并非如此.
查看zoneinfoPython 3.9 中的模块,我想知道它是否还提供了一个方便的选项来检索 Windows 上的本地时区(操作系统设置)。
在 GNU/Linux 上,你可以这样做
\nfrom datetime import datetime\nfrom zoneinfo import ZoneInfo\n\nnaive = datetime(2020, 6, 11, 12)\naware = naive.replace(tzinfo=ZoneInfo(\'localtime\'))\nRun Code Online (Sandbox Code Playgroud)\n但在 Windows 上,这会抛出
\n\n\nZoneInfoNotFoundError: \'未找到包含关键本地时间的时区\'
\n
那么我还需要使用第三方库吗?例如
\nimport time\nimport dateutil\n\ntzloc = dateutil.tz.gettz(time.tzname[time.daylight])\naware = naive.replace(tzinfo=tzloc)\nRun Code Online (Sandbox Code Playgroud)\n由于time.tzname[time.daylight]返回本地化名称(在我的例子中为德语,例如 \'Mitteleurop\xc3\xa4ische Sommerzeit\'),因此这也不起作用:
aware = naive.replace(tzinfo=ZoneInfo(tzloc))\nRun Code Online (Sandbox Code Playgroud)\n有什么想法吗?
\nps 要在 Python < 3.9 上尝试此操作,请使用backports(另请参阅此答案):
pip install backports.zoneinfo\npip install tzdata # needed on Windows\nRun Code Online (Sandbox Code Playgroud)\n 使用pytz,我知道如何列出时区名称,但我想获得每个时区名称的所有可能的时区缩写:
import pytz
list(pytz.common_timezones)
['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa',...]
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是任何时区缩写,例如PST或PDT,忽略当前日期时间(例如现在),返回所有可能的时区名称,在这种情况下是一个包含America/Los_Angeles的列表。
谢谢
我有一个运行的简单Java Executor线程。这只是检测时区并显示。
代码如下:
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
TimeZone.setDefault(null);
//get Calendar instance
Calendar now = Calendar.getInstance();
//get current TimeZone using getTimeZone method of Calendar class
TimeZone timeZone = now.getTimeZone();
//display current TimeZone using getDisplayName() method of TimeZone class
System.out.println("Current TimeZone is : " + timeZone.getDisplayName());
System.out.println( System.getProperty( "user.timezone" ) );
}
}, 0, 10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
问题是,如果我使用控制面板单独手动修改时区,我的时区没有更新。
我读过一篇解释JVM时间问题的文章 Java System.getProperty(“ user.timezone”)不起作用
现在我需要检测系统时区变化