2017-01-26 5 views
3

Вот мой код:даты и времени преобразования в Python

from datetime import datetime 

def get_local_time(time_str): 
    """ 
    takes a string in the format of '27 March at 3:00' which is UTC 
    and converts it to local time and AM/PM 
    :param time_str: 
    """ 
    offset = datetime.now() - datetime.utcnow() 
    time_dt = datetime.strptime(time_str, '%d %b at %H:%M') 
    return (time_dt + offset).strftime('%I:%M %p') 

Что у меня возникли проблемы с использует time_str, что только время и не включает в себя день/месяц. то есть: "2:00"

Если изменить его на: time_dt = datetime.strptime (time_str, '% H:% M'), то я получаю сообщение об ошибке о STRFTIME и лет до 1900 года

Так Я здесь. Что нужно сделать, чтобы просто ввести время во входной строке?

ответ

2

Вы можете попробовать: dateutil package. Метод parser.parse() хорош, когда меняется строка ввода. Он построит объект datetime с текущей датой, если в строке указано только время. Он будет обрабатывать различные другие форматы.

from datetime import datetime 
from dateutil import parser 

def get_local_time(time_str): 
    """ 
    takes a string in the format of '27 March at 3:00' which is UTC 
    and converts it to local time and AM/PM 
    :param time_str: 
    """ 
    offset = datetime.now() - datetime.utcnow() 
    time_dt = parser.parse(time_str) 
    return (time_dt + offset).strftime('%I:%M %p') 

Если вы ограничены только пакет даты и времени вы можете сделать что-то вроде этого:

from datetime import datetime 

def get_local_time(time_str): 
    """ 
    takes a string in the format of '27 March at 3:00' which is UTC 
    and converts it to local time and AM/PM 
    :param time_str: 
    """ 
    if len(time_str) <= 5: 
     time_str = datetime.now().strftime('%d %B at ') + time_str 
    offset = datetime.now() - datetime.utcnow() 
    time_dt = datetime.strptime(time_str, '%d %B at %H:%M') 
    return (time_dt + offset).strftime('%I:%M %p') 

print get_local_time('27 March at 3:00') 
print get_local_time('3:00') 

Или вы можете сделать это так:

from datetime import datetime 

def get_local_time(time_str): 
    """ 
    takes a string in the format of '27 March at 3:00' which is UTC 
    and converts it to local time and AM/PM 
    :param time_str: 
    """ 
    offset = datetime.now() - datetime.utcnow() 
    if len(time_str) <= 5: 
     time_dt = datetime.combine(datetime.now().date(), datetime.strptime(time_str, '%H:%M').time()) 
    else: 
     time_dt = datetime.strptime(time_str, '%d %B at %H:%M') 
    return (time_dt + offset).strftime('%I:%M %p') 

print get_local_time('27 March at 3:00') 
print get_local_time('3:00') 
+0

Я предполагаю, что это будет работать нормально. Но я использую это в сочетании с другим приложением (Kodi), и поскольку dateutil, похоже, не является библиотекой, включенной в нее, она не работает. Все еще отмечая это как ответ, если у кого-то есть что-то еще. – Bahnzo

+1

@Bahnzo \t Я улучшу его, если вам не нужен пакет даты. Дайте некоторое время. – MYGz

+0

@Bahnzo \t Я надеюсь, что он сработает для вас сейчас. – MYGz

2

Я просто попробовал это в реплике. Он работал для меня:

>>> from datetime import datetime 
>>> time = "02:00" 
>>> time_dt = datetime.strptime(time, '%H:%M') 
>>> time_dt 
datetime.datetime(1900, 1, 1, 2, 0) 
>>> 

Если я правильно помню, Задан никогда не может хранить только время, всегда будет фиктивная дата 1 января 1900 г. Если вы хотите сохранить время без фиктивной даты, попробуйте использовать класс time. Он также имеет функцию strftime, см. Здесь документы: https://docs.python.org/2/library/time.html

Вы также можете попробовать добавить другую дату-манекен к вашему дате, если он не работает.

+0

Я определенно получаю сообщение об ошибке. Это используется с приложением под названием «Kodi», которое использует python 2.7. поэтому я не уверен, как это мешает. Но вы также правы, я могу добавить фиктивный день и месяц, и он отлично работает. Кажется, мне не нужно. – Bahnzo

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