使用 pytz 将 UTC 转换为其他地方的本地时间
Posted
技术标签:
【中文标题】使用 pytz 将 UTC 转换为其他地方的本地时间【英文标题】:Converting UTC to local time somewhere else by using pytz 【发布时间】:2021-08-02 05:04:57 【问题描述】:我正在尝试将 sun 和 f 变量都转换为日本的当地时间。 我的代码仍然以 UTC 格式给出输出。
if night_time:
sun = [float(str(time_now.jd)), float(str(next_sun_rise))]
else:
sun = [float(str(next_sun_set)), float(str(next_sun_rise))]
if AlwaysBelowTheHorizon:
pass
elif Circumpolar:
sun = Time(sun, format='jd')
if night_time:
post_message_to_slack("Bingo! We can observe it now until sunrise at ".format(sun.iso[1]))
else:
post_message_to_slack("Sun will set at ".format(sun.iso[0]))
else:
if grb_above:
grb = [float(str(time_now.jd)), float(str(grb_set))]
else:
grb = [float(str(grb_rise)), float(str(grb_set))]
intervals = [sun, grb]
N = len(intervals)
f = findIntersection(intervals, N)
f = f.datetime(timezone('UTC'))
f = f.astimezone(timezone('Asia/Tokyo'))
post_message_to_slack("We can observe it from to ".format(f[0], f[1]))
【问题讨论】:
嗨,欢迎来到 *** 并祝贺您的第一个问题!请注意,在发布 Python 代码时,确保其格式正确非常重要,因为 Python 中的正确缩进很重要。您应该确保在所有缩进完整的情况下逐字复制/粘贴它。我已尝试将您的代码示例重新格式化为我认为的预期,但您可能需要仔细检查。 另一方面,您的代码缺少重要的上下文,例如您如何初始化变量time_now
和grb_rise
等,以及findIntersection
函数的定义。由于您的问题是关于将 astropy Time
对象转换为特定时区的时间,因此将来尝试将问题 just 集中在该方面(执行此任务的最小步骤)而不是不相关的东西,比如向 slack 发布消息。见How to create a Minimal, Reproducible example
【参考方案1】:
除了我的 cmets,如果这回答了你的问题,如果你有一个现有的带有 UTC 刻度的 JD 格式的 Astropy Time
对象,你可以将其转换为 Python 时区感知 datetime
对象,如:
>>> from astropy.time import Time
>>> from pytz import timezone
>>> t = Time(Time.now(), format='jd')
>>> t
<Time object: scale='utc' format='jd' value=2459346.8222489627>
>>> tz = timezone('Asia/Tokyo')
>>> dt = t.to_datetime(timezone=tz)
>>> dt
datetime.datetime(2021, 5, 12, 16, 44, 2, 310364, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
float(str(time.jd))
的任何东西都不是必需的。例如,如果您有两个现有的Time
对象sun_rise
和sun_set
,并且您想将它们组合成一个Time
数组,您已经可以这样做了:
>>> sun = Time([sun_rise, sun_set])
不需要任何手动(且容易出错)的类型转换洗牌。
【讨论】:
以上是关于使用 pytz 将 UTC 转换为其他地方的本地时间的主要内容,如果未能解决你的问题,请参考以下文章