当前位置: 首页 > 科技观察

在Python中表示当前时间

时间:2023-03-16 21:07:14 科技观察

在Python中获取当前时间是许多与时间相关的操作的良好起点。一个非常重要的用例是创建时间戳。在本教程中,您将学习如何使用datetime模块获取、显示和格式化当前时间。我们将学习如何读取当前时间的属性,例如年、分或秒。为了使时间更易于阅读,将探索打印时间的选项。我们还将了解不同的时间格式,了解计算机如何表示时间、如何序列化时间以及如何处理时区。如何在Python中获取时间获取和打印当前时间的最直接方法是使用datetime模块中datetime类的.now()方法。>>>fromdatetimeimportdatetime>>>now=datetime.now()>>>nowdatetime(2022,11,22,14,31,59,331225)>>>print(now)2022-11-2214:31:59.331225类方法.now()是一个返回日期时间对象的构造方法。当REPL评估now变量时,您将获得datetime对象的表示。可能很难知道每个数字的含义。但是,如果您显式打印now变量,那么您会得到一个略有不同的输出,该输出以熟悉的时间戳格式显示信息。您可能认识打印的日期时间对象的格式。它严格遵循国际标准ISO8601来格式化时间和日期。您会在很多地方找到这种格式!但是,Python使用的格式与ISO8601标准略有不同。标准规定时间戳的日期和小时部分应该用T字符分隔,但通过print()函数传递的默认日期对象用空格分隔它们。Python是可扩展和可定制的,这使您能够定制打印时间戳的格式。打印时,日期时间类在内部使用其.isoformat()方法。由于.isoformat()只是一个实例方法,您可以直接从任何日期时间对象调用它来自定义ISO时间戳。>>>datetime.now().isoformat()'2022-11-22T14:31:59.331225'>>>datetime.now().isoformat(sep="")'2022-11-2214:31:59.331225'您会注意到,当您在不带任何参数的情况下调用.isoformat()时,会使用标准的ISO8601分隔符T。但是,datetime类实现其特殊实例方法.__str__()的方式采用空格作为分隔符参数。能够获得完整的日期和时间真是太好了,但有时您可能正在寻找特定的东西。例如,您可能只想知道月份或日期。在这些情况下,您可以从一系列属性中进行选择。>>>从日期时间导入日期时间>>>现在=日期时间。now()>>>print(f"""...{now.month=}...{now.day=}...{now.hour=}...{now.minute=}...{now.weekday()=}...{now.isoweekday()=}"""...)现在。月=11现在。day=22now.hour=14now.minute=31now.weekday()=1now.isoweekday()=2在此代码段中,使用了三重引号的f字符串,大括号内的=符号输出表达式及其结果。继续探索不同的属性和方法,使用datetime对象调用dir()函数以列出当前范围内可用的名称。或者您可以查看日期时间的文档。无论哪种方式,您都会发现有很多选择。您会注意到最后一个示例的结果通常是数字。这可能适合您,但可能将工作日显示为数字并不理想。它也可能特别令人困惑,因为.weekday()和.isoweekday()方法返回不同的数字。ISO时间戳很好,但也许您想要比ISO时间戳更具可读性的内容。例如,毫秒对于人类来说可能有点难以阅读。在下一节中,您将学习如何按照您喜欢的方式设置时间戳的格式。格式化时间戳以提高可读性为了方便以自定义的、人类可读的格式输出时间,datetime有一个名为.strftime()的方法。.strftime()方法需要格式代码作为参数。格式代码是一个包含一堆特殊标记的字符串,这些标记将被datetime对象中的信息替换。.strftime()方法将为您提供大量关于如何准确表示日期时间对象的选项。例如,以下面的格式为例。>>>fromdatetimeimportdatetime>>>datetime.now().strftime("%A,%B%d")'Tuesday,November22'在此示例中,使用以下格式代码:%A:dayof周全名%B:月份全名%d:格式字符串中当前月份的数字日期逗号和文字空格按原样打印。.strftime()方法只替换它识别的代码。.strftime()中的格式代码始终以百分号(%)开头,遵循旧的C标准。这些代码类似于旧的printf字符串格式化样式,但又不相同。格式代码文档有一个很好的表格,向您展示了可以使用的所有不同格式代码。>>>f"{datetime.now():%A,%B%d}"'11月22日,星期二'所以现在您可以获取时间并根据自己的喜好设置格式。这应该涵盖您的基本时间显示需求,但您可能对计算机内部如何表示和处理时间以及时间如何存储在文件或数据库中感到好奇。您将在下一节中了解这一点。获取当前Unix时间计算机喜欢Python中的数字。但是日期和时间是遵循有趣规则的有趣人类数字。一天有24小时吗?一小时60分钟?这是谁的好主意?为了简化问题,并考虑到计算机不介意大数字,在Unix操作系统开发过程中的某个时候做出了一个决定。该决定将所有时间表示为自1970年1月1日午夜UTC以来经过的秒数。这个时间点也称为Unix纪元。这种时间系统称为Unix时间。今天的大多数计算机系统——甚至是Windows——都使用Unix时间来表示内部时间。1970年1月1日UTC午夜Unix时间零。如果你想知道当前的Unix时间,那么你可以使用另一种datetime方法。>>>fromdatetimeimportdatetime>>>datetime.now().timestamp()1669123919.331225.timestamp()方法高精度返回自Unix纪元以来的秒数。毕竟,在所有的属性和方法下,每个日期对大多数计算机来说无非就是一个大数字。在大多数情况下,您可以不理会Unix时间。这是一种表示时间的方式,适用于计算机,但不适用于那些使用人类日历(例如公历)的计算机。然而,Unix时间戳将出现在您的日期和时间探索之旅中,因此它们绝对值得了解。正确生成的Unix时间戳的一大优点是它可以明确地捕捉世界上的一个时刻。Unix的纪元始终采用UTC,因此时区偏移量没有歧义——也就是说,如果您可以可靠地创建不偏离UTC的时间戳。但不幸的是,您经常不得不处理混乱的时区问题。但是,不要害怕!在下一节中,您将学习如何处理时区。在下一节中,您将了解时区感知数据时间对象。Unix时间戳对于获取时区相关的Python时间和日期对象的明确性很有吸引力,但一般来说,最好将时间和日期序列化为ISO8601格式,因为除了易于计算机分析之外,它也是人类可读性强,符合国际标准。更重要的是,虽然Unix时间戳在某种程度上是可以识别的,但它们可能会被误认为代表其他东西。毕竟,它们只是数字。使用ISO时间戳,您马上就会知道它代表什么。引用Python之禅,可读性很重要。如果您想以完全明确的方式表示您的日期时间对象,那么您首先需要让您的对象了解时区。一旦你有了一个时区感知对象,时区信息就会添加到你的ISO时间戳中。>>>fromdatetimeimportdatetime>>>now=datetime.now()>>>print(now.tzinfo)None>>>now_aware=now.astimezone()>>>print(now_aware.tzinfo)浪漫标准时间>>>now_aware.tzinfodatetime.timezone(datetime.timedelta(seconds=3600),'浪漫标准时间')>>>now_aware.isoformat()'2022-11-22T14:31:59.331225+01:00'in在这个例子中,它首先证明了now对象没有任何时区信息,因为它的.tzinfo属性返回了none。当您调用.astimezone()onnow时不带任何参数,本地系统的时区用于使用时区对象填充.tzinfo。时区对象本质上只是与UTC的偏移量和名称。在此示例中,本地时区的名称为浪漫标准时间,时差为3600秒,即一小时。现在数据时间对象有一个时区对象,您可以将其视为时区感知。因此,当您在时区感知对象上调用.isoformat()时,您会注意到+01:00附加到末尾。这表示与UTC时间相差一小时。如果你在不同的地方,比如秘鲁的利马,那么你的.isoformat()输出可能看起来像这样。>>>now_aware.isoformat()'2022-11-22T07:31:59.331225-06:00'时间会有所不同,您会看到与UTC的偏移量现在为-06:00。因此,现在您的时间戳看起来不错,并且在表示时间方面毫不含糊。您甚至可以更进一步,将您的时间戳存储为UTC时间,正如许多人所做的那样,一切都将被很好地规范化。>>>fromdatetimeimportdatetime,timezone>>>now=datetime.now()>>>now.isoformat()'2022-11-22T14:31:59.331225'>>>now_utc=datetime.now(timezone.utc)>>>now_utc.isoformat()'2022-11-22T13:31:59.331225+00:00'将timezone.utc时区传递给.now()构造方法将返回UTC时间。请注意,在此示例中,时间与本地时间有偏差。ISO8601标准也接受Z而不是+00:00来表示UTC时间。这有时被称为祖鲁时间,这是航空业的称呼。在航空领域,必须以UTC时间运行。在航空等领域,无论身在何处,都在同一时间运营至关重要。想象一下,空中交通管制必须处理每架飞机根据其出发地报告的预计着陆时间。不这样做可能会造成混乱和灾难性的后果!结论在本教程中,我们掌握了时间!您已经生成了一个日期时间对象,并了解了如何挑选出该对象的不同属性。您还了解了几种以不同格式输出日期时间对象的方法。您还熟悉了UNIX时间和ISO时间戳,并探索了如何明确地表示您的时间戳。为此,您涉足了复杂的时区世界,并使您的数据时间对象具有时区意识。