我一直在尝试将给定时间转换为不同的格式,同时考虑外部设备的时区,跳过操作系统的时区转换。
最初,我有一个以 UTC 秒为单位的时间,以及来自设备的时区。例如,我现在所在的时间是秒=1343931446,时区=-0700。我想做的是将其转换为 YYYYMMDD_HHMMSS 格式,该格式已经正常工作了一段时间。对于上述值,它应该是 20120802_111726。
自从我在 7 月 11 日方便地编写了以下代码块后,它就开始工作了。问题归结为这样一个事实,当一天只有一位数字长时(也就是从昨天开始),解析就会出错,我得到 20120821_011726。我假设问题是当我将时间值转换为日期时间时,当我打印 time_t 时,我会得到 time.struct_time(tm_year=2012, tm_mon=8, tm_mday =2, tm_hour=18, tm_min=17, tm_sec=26, tm_wday=3, tm_yday=215, tm_isdst=0),当解析为datetime时被视为单字符串>。
问题是,我能否强制 datetime 接受月份/日期的 2 个字符输入以便正确解析,或者是否有更好的方法来转换这些格式?请记住,此当前方法是由于无法使用任何说明当前系统时间的方法而编写的,因为这是在不保证系统上的时区与秒数所在的设备相同的情况下完成的获得自。
def convert_time(seconds, tz):
""" Times obtained were in seconds since epoch.
Convert to format YYYYMMDD_HHMMSS.
"""
time_t = time.gmtime(seconds) # convert to time tuple
# convert to datetime format - because time zone comparisons can't be made
# in a format directly convertible from UTC
time_dt = datetime.datetime.strptime(str(time_t.tm_year) +
str(time_t.tm_mon) +
str(time_t.tm_mday) +
str(time_t.tm_hour) +
str(time_t.tm_min) +
str(time_t.tm_sec),
'%Y%m%d%H%M%S')
# Convert time zone to timedelta
offset = datetime.timedelta(hours=int(tz.lstrip('-')[:2]),
minutes=int(tz.lstrip('-')[2:]))
sign = -1 if tz.startswith('-') else 1
time_dt = time_dt + sign * offset
time_dt = time_dt.strftime('%Y%m%d_%H%M%S')
return time_dt
请您参考如下方法:
您的时间戳以秒为单位,您的时区以小时和分钟为单位。只需减去或加上转换为秒的时区,然后使用 time.strftime 函数将其格式化为您想要的字符串:
def convertTime(seconds, tz):
tzhours, tzminutes = map(int, (tz.lstrip('-')[:2], tz[-2:]))
offset = tzhours * 3600 + tzminutes * 60
if tz.startswith('-'):
offset *= -1
return time.strftime('%Y%m%d_%H%M%S', time.gmtime(seconds + offset))
