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

如何获得给定时区的UTC时间“午夜”?

司徒高寒
2023-03-14
问题内容

我现在能想到的最好的就是这种怪诞:

>>> datetime.utcnow() \
...   .replace(tzinfo=pytz.UTC) \
...   .astimezone(pytz.timezone("Australia/Melbourne")) \
...   .replace(hour=0,minute=0,second=0,microsecond=0) \
...   .astimezone(pytz.UTC) \
...   .replace(tzinfo=None)
datetime.datetime(2008, 12, 16, 13, 0)

即,以英语获取当前时间(以UTC为单位),将其转换为其他时区,将时间设置为午夜,然后再转换回UTC。

我不只是使用now()或localtime(),因为那样会使用服务器的时区,而不是用户的时区。

我忍不住感觉自己缺少什么,有什么想法吗?


问题答案:

我认为如果这样做,您可以省去一些方法调用:

>>> from datetime import datetime
>>> datetime.now(pytz.timezone("Australia/Melbourne")) \
            .replace(hour=0, minute=0, second=0, microsecond=0) \
            .astimezone(pytz.utc)

但是…在代码中,比美观还存在一个更大的问题:在转换为夏令时或从夏令时转换之日,它将给出错误的结果。

这样做的原因是,既没有日期时间构造函数,也没有replace()考虑DST更改。

例如:

>>> now = datetime(2012, 4, 1, 5, 0, 0, 0, tzinfo=pytz.timezone("Australia/Melbourne"))
>>> print now
2012-04-01 05:00:00+10:00
>>> print now.replace(hour=0)
2012-04-01 00:00:00+10:00 # wrong! midnight was at 2012-04-01 00:00:00+11:00
>>> print datetime(2012, 3, 1, 0, 0, 0, 0, tzinfo=tz)
2012-03-01 00:00:00+10:00 # wrong again!

但是,文档tz.localize()说明:

此方法应用于构造本地时间,而不是将tzinfo参数传递给datetime构造函数。

这样,您的问题就这样解决了:

>>> import pytz
>>> from datetime import datetime, date, time

>>> tz = pytz.timezone("Australia/Melbourne")
>>> the_date = date(2012, 4, 1) # use date.today() here

>>> midnight_without_tzinfo = datetime.combine(the_date, time())
>>> print midnight_without_tzinfo
2012-04-01 00:00:00

>>> midnight_with_tzinfo = tz.localize(midnight_without_tzinfo)
>>> print midnight_with_tzinfo
2012-04-01 00:00:00+11:00

>>> print midnight_with_tzinfo.astimezone(pytz.utc)
2012-03-31 13:00:00+00:00

但是,不能保证1582年之前的日期。



 类似资料:
  • 问题内容: 我有一个字符串类型就像一个计时:和是。 如何使用Java 8 datetime API将此时间信息转换为与UTC时间相对应的时间? 还需要考虑DST的东西。 问题答案: 您正在Java8 中寻找类-带有时区的完整日期时间和与UTC /格林威治标准时间的偏移量。就设计而言,此类应主要视为a 和a 的组合。的是一个至关重要的,但次要的,一条信息,用于确保所述类表示瞬间,特别是在夏令重叠。

  • 环境 Spring Boot Starter Data JPA 1.4.2 Eclipselink 2.5.0 PostgreSQL 9.4.1211.jre7 我查看了数据库,时间戳包含我的本地时区日期时间,但我想用UTC存储它。这是因为我的默认时区设置为'Europe/Brussely',JPA/JDBC在将我的对象放入数据库之前将其转换为我的时区。 发现了不理想的解决方案 > 具有我想要实现

  • 问题内容: 我该如何修改对 与产生的东西 问题答案: 一个快速的解决方法是执行以下操作: 一种更合适的方法是使用编译器扩展并定义的自定义编译。实际上,它的文档中已经有一个示例,它使用了不同的方法(函数)。由于您仅需要Postgres使用(我假设您在SA邮件列表中以前的电子邮件中都在使用Postgres),因此,这是另一个(更简单的)快速修复方法:

  • 问题内容: 我是Android的新手,根据当前时区,我目前面临获取当前时间的问题。 我以“ GMT-7”格式获取时区,即字符串。而且我有系统时间。 有没有一种干净的方法来获取上述给定时区中的当前时间?任何帮助表示赞赏。谢谢, 编辑:试图做到这一点: 问题答案: 我让它像这样工作: 此外,基于该日期的其他所有时间转换也应与此时区一起使用,否则,将使用设备的默认时区,并且将基于该时区转换时间。

  • 问题内容: 要求是简单地获取给定时区的当前时间( 包括正确的DST调整 )。 SO似乎在这方面徘徊了一些问题,但是我似乎找不到以节省时间的低摩擦方式得出的直接答案(在SO,Joda doco或谷歌搜索中)。似乎在给定的输入(当前UTC时间和所需的TZ)下,我应该能够从Joda Time库中链接几个方法来实现我想要的功能,但是在上述示例中似乎希望评估+处理偏移量/应用程序代码中的转换- 如果可能的话

  • 由于对java时间的发展以及为什么会有成千上万的相关帖子感到十分困惑,我设法使用jodaTime存储了UTC时间: 因为我使用的是Hibernate(并且不愿意使用JodaTime的适配器来正确处理版本4),所以我只使用这个jodaTime方法将jdk时间转换为utc。这似乎产生了预期的结果,本地时间(当前伦敦格林尼治标准时间1)通过从本地时间减去1来转换为UTC。 目前为止,一切都好。然后,每当

  • 问题内容: 在编写Web应用程序时,将 所有 日期时间(服务器端)存储在数据库中作为UTC时间戳是有意义的。 当我发现您无法在JavaScript中对时区进行操作方面自然无法做到这一点时,我感到非常惊讶。 我稍微扩展了Date对象。这个功能有意义吗?基本上,每次我向服务器发送任何内容时,都会使用该功能格式化时间戳记。 您在这里看到任何重大问题吗?还是从另一个角度解决问题? 在我看来,这有点令人费解

  • 问题内容: 我想获取UTC的当前时间。我到目前为止所做的是(仅出于测试目的): 是我的当地时间,那很好 是我的本地时间+ 1,但应该是本地时间-1 … 我的本地时区是UTC + 1(根据调试输出和此处的列表:https : //www.joda.org/joda- time/timezones.html )… 如何正确地从一个时区转换为另一个时区(包括毫秒表示)? 编辑 我需要日期/毫秒…这不是正