2015-09-07 5 views
0

Я знаю, что есть некоторые сообщения об использовании timedelta объектов в Python и Python doc достаточно ясно, чтобы все понять. Но я ничего не могу понять. Давайте предположим, что у нас есть две даты:Timedeltas in Python

t1 = 'Fri 11 Feb 2078 00:05:21 +0400' 
t2 = 'Mon 29 Dec 2064 03:33:48 -1100' 

Я разобран как t1 и t2 используя код ниже, чтобы найти разницу между ними в секундах:

def offset(arg): 
    return timedelta(hours = arg/100, minutes = arg % 100) 

def normalize(time, offset, sign): 
    return time+offset if sign == '-' else time-offset 

def main(): 
    t1offset = offset(int(t1[-5:])) 
    t2offset = offset(int(t2[-5:])) 

    t1 = normalize(datetime.strptime(t1[:-6], 
        "%a %d %b %Y %H:%M:%S"), t1offset, t1[-5]) 
    t2 = normalize(datetime.strptime(t2[:-6], 
        "%a %d %b %Y %H:%M:%S"), t2offset, t2[-5]) 

    if t1>t2: 
     print (t1-t2).total_seconds() 
    elif t2>t1: 
     print (t2-t1).total_seconds() 
    else: 
     print 0 

Правильный ответ |t1-t2| = 413962293 в то время как мой результат 414041493. Это разница в 79200 секунд -> 22 часа. Что я делаю не так? Что я пропустил или что я должен решить для решения этой проблемы?

+0

Кто голосовал его закрыть, это совершенно правильный вопрос с достаточным количеством кода легко воспроизвести проблему. – Andrey

+0

@ Andrey, но это не * минимальный * код для воспроизведения проблемы (см. [Mcve]), поскольку OP не выполнил базовую двоичную отладочную поиск. – jonrsharpe

+0

Код @jonrsharpe не совсем минимален, но достаточно мал, не идеален, но хорошо понимать проблему. Этот вопрос не так уж плох, чтобы его можно было закрыть. – Andrey

ответ

0

Вы помещаете знак смещения в функцию offset.

'Fri 11 Feb 2078 00:05:21 +0400'[-5:] == '+0400' 

Я думаю, что это должно быть только цифры:

'Fri 11 Feb 2078 00:05:21 +0400'[-4:] == '0400' 

Таким образом, ваше смещение имеет отрицательные значения, и в функции нормализуют вы подаете знак снова. Попробуйте это:

def main(): 
    t1offset = offset(int(t1[-4:])) 
    t2offset = offset(int(t2[-4:])) 

    t1 = normalize(datetime.strptime(t1[:-6], 
      "%a %d %b %Y %H:%M:%S"), t1offset, t1[-5]) 
    t2 = normalize(datetime.strptime(t2[:-6], 
        "%a %d %b %Y %H:%M:%S"), t2offset, t2[-5]) 

    if t1>t2: 
     print (t1-t2).total_seconds() 
    elif t2>t1: 
     print (t2-t1).total_seconds() 
    else: 
     print 0 

Однако, вы действительно не должны разобрать строку метки времени, как это, используя жестко закодированные строковые индексы.

+0

hege_hegedus, вашего ответа было достаточно, чтобы помочь мне решить проблему. Я просто пропустил, что снова применяю знак в функции нормализации :) – hebius

+0

@hebius Я рад помочь, и вы счастливы, что ваш код работает. Если у вас нет дополнительных вопросов, не могли бы вы принять этот ответ? –

+0

Готовые мужчины :) И еще раз спасибо за вашу помощь :) – hebius

-1

Это не самый лучший способ для разбора дат с часовыми поясами, но если вы хотите это так, что ваша ошибка:

def normalize(time, offset, sign): 
    return time+offset if sign == '+' else time-offset 
           ^

Нормализация должна быть наоборот.

Если вы используете Python 3+ (которые вы должны), вы можете просто сделать:

datetime.strptime(t1, "%a %d %b %Y %H:%M:%S %z") 

Timezone спецификатор не работает в Python 2.x

Или используйте dateutils LIB:

import dateutil 
dateutil.parser.parse('Fri 11 Feb 2078 00:05:21 +0400') 

Редактировать: лучший способ сделать это в оригинальной манере - полностью сравнить знак знака и положиться на знак разобранного оцепенения er:

def offset(arg): 
    return -timedelta(hours = arg/100, minutes = arg % 100) 

def normalize(time, offset): 
    return time+offset 
0

Формат времени похож на the date/time format used in emails. Вы можете использовать email модуль синтаксического анализа:

>>> from email.utils import parsedate_tz, mktime_tz 
>>> ts1 = mktime_tz(parsedate_tz('Fri 11 Feb 2078 00:05:21 +0400')) 
>>> ts2 = mktime_tz(parsedate_tz('Mon 29 Dec 2064 03:33:48 -1100')) 
>>> ts1 - ts2 
413962293 

 Смежные вопросы

  • Нет связанных вопросов^_^