2012-08-02 70 views
2

我一直在努力将给定的时间转换为不同的格式,考虑到外部设备的时区,跳过操作系统的时区转换。Python strptime - 处理单个数字日期

最初,我有UTC时间的时间和设备的时区。例如,我现在的时间是秒= 1343931446,时区= -0700。我想要做的是将其转换为格式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接受每月/每小时的双字符输入,因此它可以正确解析,还是有更好的方法来转换这些格式?请记住,这种当前的方法是由于无法使用考虑当前系统时间的任何方法而编写的,因为这是在时区不能保证与系统上的时区相同的情况下进行的,从...获取。

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 
+2

为什么不使用'datetime.datetime(* time_t的[6],tzinfo =无)'? – 2012-08-02 18:32:45

+0

另外,您可以使用时区对象(请参阅[documentation](http://docs.python.org/library/datetime.html#tzinfo-objects))来处理偏移量; timedelta对象不是要走的路。 – 2012-08-02 18:34:47

+0

这种转换方法非常完美。我知道我的方法非常迂回,错误使得情况更糟。随意发布,作为答案。 – russ36363 2012-08-02 18:37:13

回答

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))