2

我一直在尝试将给定时间转换为不同的格式,考虑到外部设备的时区,跳过操作系统的时区转换。

最初,我有一个以 UTC 秒为单位的时间,以及来自设备的时区。例如,我现在所在的时间是秒=1343931446,时区=-0700。我想要做的是将它转换为 format YYYYMMDD_HHMMSS,它已经正常工作了一段时间。对于上述值,它应该是20120802_111726

自从我在 7 月 11 日方便地编写后,以下代码块就可以正常工作。问题归结为这样一个事实,即当一天只有 1 位数长(也就是从昨天开始)时,解析出错了,我得到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
4

1 回答 1

1

您的时间戳以秒表示,您的时区以小时和分钟表示。只需减去或添加转换为秒的时区,然后使用 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))
于 2012-08-02T18:40:52.710 回答