>>> datetime.strptime('2017-07-04 12:24:11', "%Y-%m-%d %I:%M:%S")
datetime.datetime(2017, 7, 4, 0, 24, 11)

Почему вышеупомянутое преобразование получает час 0? Что, если я имел в виду 12:24:11 днем в 12-часовом формате?

В 12 часовом формате:

12:24:11 2017-07-04 вскоре после полуночи будет указано как 12:24:11

А также

12:24:11 2017-07-04 вскоре после полудня также будет указан как 12:24:11

Почему он принял и преобразовал это время вскоре после полуночи?

Я надеялся, что это выдаст предупреждение или ошибку, потому что моя временная строка не достаточно конкретна.

2
Ankur Agarwal 26 Авг 2017 в 22:03

3 ответа

Лучший ответ

Такое поведение должно было быть дизайнерским решением. Вот соответствующая часть функции _strptime в \ Lib \ _strptime .py

    elif group_key == 'I':
        hour = int(found_dict['I'])
        ampm = found_dict.get('p', '').lower()
        # If there was no AM/PM indicator, we'll treat this like AM
        if ampm in ('', locale_time.am_pm[0]):
            # We're in AM so the hour is correct unless we're
            # looking at 12 midnight.
            # 12 midnight == 12 AM == hour 0
            if hour == 12:
                hour = 0
        elif ampm == locale_time.am_pm[1]:
            # We're in PM so we need to add 12 to the hour unless
            # we're looking at 12 noon.
            # 12 noon == 12 PM == hour 12
            if hour != 12:

Вы можете настроить его, чтобы сделать то, что вы хотите ..

class foo(datetime.datetime):
    """foo(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])

    The year, month and day arguments are required. tzinfo may be None, or an
    instance of a tzinfo subclass. The remaining arguments may be ints.
    """

    @classmethod
    def strptime(cls, datestring, fmt):
        if '%I' in fmt and not any(attr in datestring for attr
                                   in ('AM', 'am', 'PM', 'pm')):
            print('Ambiguous datestring with twelve hour format')
            #raise ValueError('Ambiguous datestring with twelve hour format')
        return super().strptime(datestring, fmt)

Я полагаю, что вы могли бы взять конечность и воспроизвести функцию _strptime с вашими модификациями, а затем назначить ее соответствующим образом для создания чего-то более плавного, но я не знаю, насколько это разумно. Это то, что люди называют патчами обезьян?

2
wwii 26 Авг 2017 в 20:35

Если вы используете %I, тогда:

>>> datetime.strptime('2017-07-04 12:24:11', "%Y-%m-%d %I:%M:%S")
datetime.datetime(2017, 7, 4, 0, 24, 11)

В то время как если вы используете %H:

>>> datetime.strptime('2017-07-04 12:24:11', "%Y-%m-%d %H:%M:%S")
datetime.datetime(2017, 7, 4, 12, 24, 11)

strftime и поведение strptime
ПРИМЕЧАНИЕ. - %I для Часа (12-часовые часы) в качестве десятичного числа с добавлением нуля, а %H для Часа (24- часы) как десятичное число с добавлением нуля.

0
Vineet Jain 26 Авг 2017 в 20:34

Формат даты является причиной, по которой вы получаете указанный формат 0. См. Документацию для получения правильного формата. Используйте% I для 12-часового формата и% H для 24-часового формата -

aspo 26 Авг 2017 в 19:19