Python 3 如何格式化为 yyyy-mm-ddThh:mm:ssZ
Python 3如何格式化为yyyy-mm-ddThh:mm:ssZ
问题的出现原因:
在ISO 8601中,“Z”表示“zulu time”或UTC(“+00:00”),而当地时间通常由其与UTC的偏移来指定。更糟糕的是,这些偏移可以因夏令时(DST)而在一年中发生变化。因此,除非您在冬天住在英国或夏天住在冰岛,否则您很可能没有那么幸运地与本地时间一起使用UTC,并且您的时间戳将完全错误。
解决方法:
为了正确处理这个问题,我们需要使用“aware” datetime对象,该对象考虑了时区的影响。以下是一个解决方法的示例代码:
from datetime import datetime, timezone # a naive datetime representing local time naive_dt = datetime.now() # incorrect, local (MST) time made to look like UTC (very, very bad) naive_dt.strftime("%Y-%m-%dT%H:%M:%SZ") # '2020-08-27T20:57:54Z' (actual UTC == '2020-08-28T02:57:54Z') # so we'll need an aware datetime (taking your timezone into consideration) aware_dt = naive_dt.astimezone() # correct, ISO-8601 (but not UTC) aware_dt.isoformat(timespec='seconds') # '2020-08-27T20:57:54-06:00' # lets get the time in UTC utc_dt = aware_dt.astimezone(timezone.utc) # correct, ISO-8601 and UTC (but not in UTC format) utc_dt.isoformat(timespec='seconds') # '2020-08-28T02:57:54+00:00' # correct, UTC format (this is what you asked for) date_str = utc_dt.isoformat(timespec='seconds').replace('+00:00', 'Z') # '2020-08-28T02:57:54Z' # Perfect UTC format date_str = utc_dt.isoformat(timespec='milliseconds').replace('+00:00', 'Z') # '2020-08-28T02:57:54.640Z'
上述代码中,我们首先创建了一个naive datetime对象,它表示本地时间。然后,我们将其转换为aware datetime对象,该对象考虑了时区的影响。接下来,我们将aware datetime对象转换为UTC时间,并使用ISO-8601格式进行格式化。最后,我们将格式化后的时间中的"+00:00"替换为"Z",以得到所需的UTC格式。
除了上述方法外,还有更简单的方法来实现相同的目标。以下是一个示例代码:
from datetime import datetime, timezone def utcformat(dt, timespec='milliseconds'): """convert datetime to string in UTC format (YYYY-mm-ddTHH:MM:SS.mmmZ)""" iso_str = dt.astimezone(timezone.utc).isoformat('T', timespec) return iso_str.replace('+00:00', 'Z') def fromutcformat(utc_str, tz=None): iso_str = utc_str.replace('Z', '+00:00') return datetime.fromisoformat(iso_str).astimezone(tz) now = datetime.now(tz=timezone.utc) # default with milliseconds ('2020-08-28T02:57:54.640Z') print(utcformat(now)) # without milliseconds ('2020-08-28T02:57:54Z') print(utcformat(now, timespec='seconds')) utc_str1 = '2020-08-28T04:35:35.455Z' dt = fromutcformat(utc_string) utc_str2 = utcformat(dt) utc_str1 == utc_str2 # True # it even converts naive local datetimes correctly (as of Python 3.8) now = datetime.now() utc_string = utcformat(now) converted = fromutcformat(utc_string) now.astimezone() - converted # timedelta(microseconds=997)
上述代码定义了两个函数utcformat()和fromutcformat()。utcformat()函数将datetime对象转换为UTC格式的字符串,fromutcformat()函数将UTC格式的字符串转换为datetime对象。这些函数可以方便地处理时区和夏令时的问题。
Python 3中,要将日期时间格式化为yyyy-mm-ddThh:mm:ssZ(ISO 8601格式),需要考虑时区和夏令时的影响。通过使用“aware” datetime对象,并结合ISO-8601格式化方法和字符串替换操作,可以正确地将日期时间转换为所需的UTC格式。此外,还可以定义一些辅助函数来简化处理过程,并确保正确处理时区和夏令时的问题。
问题出现的原因:
问题是由于需要将当前时间以特定格式(yyyy-mm-ddThh:mm:ssZ)进行格式化,而原始代码没有提供这种格式化方式,所以需要找到解决方法。
解决方法:
通过使用Python的datetime模块,可以很方便地对日期和时间进行格式化操作。在这个问题中,使用datetime模块的strftime()方法,传入特定的格式字符串"%Y-%m-%dT%H:%M:%SZ",即可将当前时间格式化为所需的格式。
下面是解决问题的代码:
import datetime date = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ") print(date)
以上代码中,首先导入了datetime模块,然后使用now()方法获取当前时间,接着使用strftime()方法将时间格式化为"%Y-%m-%dT%H:%M:%SZ"的形式,最后将结果打印输出。
运行以上代码,即可得到当前时间的格式化结果。
问题的出现原因:
问题是用户需要将当前时间格式化为特定的格式(yyyy-mm-ddThh:mm:ssZ),但尝试使用datetime库的strftime函数时遇到了困难。
解决方法:
用户试图使用datetime库来解决问题,并使用strftime函数将当前时间格式化为所需的格式。但是,由于strftime函数默认会包含毫秒或子秒的信息,所以用户需要将这些信息去除。用户尝试了一些代码,并最终成功地将当前时间格式化为所需的格式。
整理后的文章如下:
尝试使用datetime库
import datetime output_date = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ") print(output_date)
更多信息,请参考Python文档。
感谢您的建议,但这样会包含毫秒或子秒的信息,我需要去除这些信息。不过,在尝试您给出的代码后,我成功地解决了问题。
import datetime date = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ") print(date)