2012-08-02 64 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))