当前位置: 首页 > 面试题库 >

Python datetime:tz内部方法与.replace之间的区别(tzinfo =)

娄丁雨
2023-03-14
问题内容

我最近修复了一个错误,但仍然不知道为什么会发生。我在Django模型中将以下时间戳(纪元)转换为datetimefield:

our_timezone = pytz.timezone("Asia/Jerusalem")
# e13 is used for true division
final_dict["published_date"] = datetime.datetime.fromtimestamp(
            float(article_as_dict["publish_date"]) / 1e3).replace(tzinfo=our_timezone)

上面的 返回的datetime对象始终 与真实的纪元时间(在我们的时区中)相距 39分钟

我设法通过移除来解决了这一问题replace,而是将时区放入了fromtimestamp方法中:

final_dict["published_date"] = datetime.datetime.fromtimestamp(
            float(article_as_dict["publish_date"]) / 1e3, tz=our_timezone)

那么,指定方法tz=our_timezone内部与创建对象之后进行操作有什么区别?为什么返回错误的时间?fromtimestamp``.replace(tzinfo=our_timezone)``.replace


问题答案:
>>> datetime.fromtimestamp(1000000000).replace(tzinfo=our_timezone)
datetime.datetime(2001, 9, 9, 3, 46, 40, tzinfo=<DstTzInfo 'Asia/Jerusalem' LMT+2:21:00 STD>)
>>> datetime.fromtimestamp(1000000000, tz=our_timezone)
datetime.datetime(2001, 9, 9, 4, 46, 40, tzinfo=<DstTzInfo 'Asia/Jerusalem' IDT+3:00:00 DST>)

请注意第一种情况下的奇数时区偏移量。

时区是多个 偏移量
的捆绑。时区偏移量随时间变化。它不仅会根据夏季和冬季的时间在一年内发生变化,而且在修订和更新时区数据时还会发生历史变化。您可以检查时区对象以获得一些有趣的历史数据,可以追溯到几十年前:

>>> our_timezone._utc_transition_times
[datetime.datetime(1, 1, 1, 0, 0), datetime.datetime(1901, 12, 13, 20, 45, 52), datetime.datetime(1917, 12, 31, 21, 39, 20), datetime.datetime(1940, 5, 31, 22, 0), datetime.datetime(1942, 10, 31, 21, 0), datetime.datetime(1943, 4, 1, 0, 0), datetime.datetime(1943, 10, 31, 21, 0), datetime.datetime(1944, 3, 31, 22, 0), datetime.datetime(1944, 10, 31, 21, 0), datetime.datetime(1945, 4, 15, 22, 0), datetime.datetime(1945, 10, 31, 23, 0), datetime.datetime(1946, 4, 16, 0, 0), datetime.datetime(1946, 10, 31, 21, 0), datetime.datetime(1948, 5, 22, 22, 0), datetime.datetime(1948, 8, 31, 20, 0), datetime.datetime(1948, 10, 31, 23, 0), datetime.datetime(1949, 4, 30, 22, 0), datetime.datetime(1949, 10, 31, 23, 0), datetime.datetime(1950, 4, 15, 22, 0), datetime.datetime(1950, 9, 15, 0, 0), datetime.datetime(1951, 3, 31, 22, 0), datetime.datetime(1951, 11, 11, 0, 0), datetime.datetime(1952, 4, 20, 0, 0), datetime.datetime(1952, 10, 19, 0, 0), datetime.datetime(1953, 4, 12, 0, 0), datetime.datetime(1953, 9, 13, 0, 0), datetime.datetime(1954, 6, 12, 22, 0), datetime.datetime(1954, 9, 11, 21, 0), datetime.datetime(1955, 6, 11, 0, 0), datetime.datetime(1955, 9, 10, 21, 0), datetime.datetime(1956, 6, 2, 22, 0), datetime.datetime(1956, 9, 30, 0, 0), datetime.datetime(1957, 4, 29, 0, 0), datetime.datetime(1957, 9, 21, 21, 0), datetime.datetime(1974, 7, 6, 22, 0), datetime.datetime(1974, 10, 12, 21, 0), datetime.datetime(1975, 4, 19, 22, 0), datetime.datetime(1975, 8, 30, 21, 0), datetime.datetime(1985, 4, 13, 22, 0), datetime.datetime(1985, 9, 14, 21, 0), datetime.datetime(1986, 5, 17, 22, 0), datetime.datetime(1986, 9, 6, 21, 0), datetime.datetime(1987, 4, 14, 22, 0), datetime.datetime(1987, 9, 12, 21, 0), datetime.datetime(1988, 4, 9, 22, 0), datetime.datetime(1988, 9, 3, 21, 0), datetime.datetime(1989, 4, 29, 22, 0), datetime.datetime(1989, 9, 2, 21, 0), datetime.datetime(1990, 3, 24, 22, 0), datetime.datetime(1990, 8, 25, 21, 0), datetime.datetime(1991, 3, 23, 22, 0), datetime.datetime(1991, 8, 31, 21, 0), datetime.datetime(1992, 3, 28, 22, 0), datetime.datetime(1992, 9, 5, 21, 0), datetime.datetime(1993, 4, 1, 22, 0), datetime.datetime(1993, 9, 4, 21, 0), datetime.datetime(1994, 3, 31, 22, 0), datetime.datetime(1994, 8, 27, 21, 0), datetime.datetime(1995, 3, 30, 22, 0), datetime.datetime(1995, 9, 2, 21, 0), datetime.datetime(1996, 3, 14, 22, 0), datetime.datetime(1996, 9, 15, 21, 0), datetime.datetime(1997, 3, 20, 22, 0), datetime.datetime(1997, 9, 13, 21, 0), datetime.datetime(1998, 3, 19, 22, 0), datetime.datetime(1998, 9, 5, 21, 0), datetime.datetime(1999, 4, 2, 0, 0), datetime.datetime(1999, 9, 2, 23, 0), datetime.datetime(2000, 4, 14, 0, 0), datetime.datetime(2000, 10, 5, 22, 0), datetime.datetime(2001, 4, 8, 23, 0), datetime.datetime(2001, 9, 23, 22, 0), datetime.datetime(2002, 3, 28, 23, 0), datetime.datetime(2002, 10, 6, 22, 0), datetime.datetime(2003, 3, 27, 23, 0), datetime.datetime(2003, 10, 2, 22, 0), datetime.datetime(2004, 4, 6, 23, 0), datetime.datetime(2004, 9, 21, 22, 0), datetime.datetime(2005, 4, 1, 0, 0), datetime.datetime(2005, 10, 8, 23, 0), datetime.datetime(2006, 3, 31, 0, 0), datetime.datetime(2006, 9, 30, 23, 0), datetime.datetime(2007, 3, 30, 0, 0), datetime.datetime(2007, 9, 15, 23, 0), datetime.datetime(2008, 3, 28, 0, 0), datetime.datetime(2008, 10, 4, 23, 0), datetime.datetime(2009, 3, 27, 0, 0), datetime.datetime(2009, 9, 26, 23, 0), datetime.datetime(2010, 3, 26, 0, 0), datetime.datetime(2010, 9, 11, 23, 0), datetime.datetime(2011, 4, 1, 0, 0), datetime.datetime(2011, 10, 1, 23, 0), datetime.datetime(2012, 3, 30, 0, 0), datetime.datetime(2012, 9, 22, 23, 0), datetime.datetime(2013, 3, 29, 0, 0), datetime.datetime(2013, 10, 26, 23, 0), datetime.datetime(2014, 3, 28, 0, 0), datetime.datetime(2014, 10, 25, 23, 0), datetime.datetime(2015, 3, 27, 0, 0), datetime.datetime(2015, 10, 24, 23, 0), datetime.datetime(2016, 3, 25, 0, 0), datetime.datetime(2016, 10, 29, 23, 0), datetime.datetime(2017, 3, 24, 0, 0), datetime.datetime(2017, 10, 28, 23, 0), datetime.datetime(2018, 3, 23, 0, 0), datetime.datetime(2018, 10, 27, 23, 0), datetime.datetime(2019, 3, 29, 0, 0), datetime.datetime(2019, 10, 26, 23, 0), datetime.datetime(2020, 3, 27, 0, 0), datetime.datetime(2020, 10, 24, 23, 0), datetime.datetime(2021, 3, 26, 0, 0), datetime.datetime(2021, 10, 30, 23, 0), datetime.datetime(2022, 3, 25, 0, 0), datetime.datetime(2022, 10, 29, 23, 0), datetime.datetime(2023, 3, 24, 0, 0), datetime.datetime(2023, 10, 28, 23, 0), datetime.datetime(2024, 3, 29, 0, 0), datetime.datetime(2024, 10, 26, 23, 0), datetime.datetime(2025, 3, 28, 0, 0), datetime.datetime(2025, 10, 25, 23, 0), datetime.datetime(2026, 3, 27, 0, 0), datetime.datetime(2026, 10, 24, 23, 0), datetime.datetime(2027, 3, 26, 0, 0), datetime.datetime(2027, 10, 30, 23, 0), datetime.datetime(2028, 3, 24, 0, 0), datetime.datetime(2028, 10, 28, 23, 0), datetime.datetime(2029, 3, 23, 0, 0), datetime.datetime(2029, 10, 27, 23, 0), datetime.datetime(2030, 3, 29, 0, 0), datetime.datetime(2030, 10, 26, 23, 0), datetime.datetime(2031, 3, 28, 0, 0), datetime.datetime(2031, 10, 25, 23, 0), datetime.datetime(2032, 3, 26, 0, 0), datetime.datetime(2032, 10, 30, 23, 0), datetime.datetime(2033, 3, 25, 0, 0), datetime.datetime(2033, 10, 29, 23, 0), datetime.datetime(2034, 3, 24, 0, 0), datetime.datetime(2034, 10, 28, 23, 0), datetime.datetime(2035, 3, 23, 0, 0), datetime.datetime(2035, 10, 27, 23, 0), datetime.datetime(2036, 3, 28, 0, 0), datetime.datetime(2036, 10, 25, 23, 0), datetime.datetime(2037, 3, 27, 0, 0), datetime.datetime(2037, 10, 24, 23, 0)]

随着datetime.fromtimestamp(1000000000)创建一个天真的时间戳,一个无时区的信息。然后,您只需使用将时区对象附加到该对象即可replace。这只会导致Python使用该时区对象中的许多偏移量对象中的第一个,这导致距100年前的偏移量很奇怪。

但是,将时区对象作为“上下文信息”fromtimestamp直接提供给该方法,可以选择适用于时间戳的正确偏移量,并正确生成一个连贯的时间戳对象。

您还可以在事实之后执行以下操作astimezone

>>> datetime.fromtimestamp(1000000000).astimezone(our_timezone)
datetime.datetime(2001, 9, 9, 4, 46, 40, tzinfo=<DstTzInfo 'Asia/Jerusalem' IDT+3:00:00 DST>)

此方法还可以智能地选择适用的偏移量。

简而言之:replace==笨拙,只需覆盖原始数据fromtimestampastimezone== smart,就知道如何使用时区。



 类似资料:
  • 本文向大家介绍内部碎片与外部碎片之间的区别,包括了内部碎片与外部碎片之间的区别的使用技巧和注意事项,需要的朋友参考一下 在从内存中加载和删除进程时,可用内存空间会分成几小块。考虑到有时由于无法将进程分配给存储块而导致其无法使用,因此有时无法将其分配给存储块。此问题称为碎片。 内部碎片 分配给进程的内存块更大。内存的某些部分未使用,因为它不能被其他进程使用。通过有效分配最小的分区但足够大的分区,可以

  • 的replace和add方法是如何以不同的方式工作的,在现实生活中是否存在需要这些方法用于特定目的的场景。

  • 《Java》中内在类的确切目的及其创作方法。如果我在类中创建方法而不是在内部类中创建那些方法,我能得到相同的行为吗? 我们既可以访问内部类方法,也可以访问外部类之外的实例方法。那么内类在Java的确切目的是什么呢?有没有一种情况/可能性,没有内在的类,我们就无法生存?

  • 本文向大家介绍内部和外部碎片化之间的区别,包括了内部和外部碎片化之间的区别的使用技巧和注意事项,需要的朋友参考一下 在这篇文章中,我们将了解内部和外部碎片化之间的区别- 内部碎片 分配的内存和所需空间之间的差异称为内部碎片。 在这种分段中,使用固定大小的存储块来处理数据。 当某个方法或过程大于所需的内存时,将发生此过程。 内部分段使用的方法是“最佳拟合”块。 当内存被划分为固定大小的分区时,会发生

  • 问题内容: 除了以后使用正则表达式之外,java.lang.String 和方法之间有什么区别?对于简单的替代喜欢,更换用 ,有什么不同? 问题答案: 在中,该replace方法可以采用一对或一对(其中是子类,因此很高兴采用一对)。该方法将替换所有出现的或。在另一方面,这两个参数和正则表达式(正则表达式)。使用错误的功能可能会导致细微的错误。

  • 问题内容: 我是android的新手,我使用以下命令打印log-cat: 和日志文本打印,但搜索了一段时间后,我发现了其他一些打印logcat的方法,例如: 现在我对这些方法感到困惑。 哪种方法最适合打印log-cat,如何打印lagcat,它们之间的主要区别是什么? 问题答案: 常用的方法有五种: 详细 调试 信息 警告 错误 1: -调试 颜色为black ,将输出任何消息,其中v表示详细的详