Python isoformat datetime - считать дни до дня рождения из строки - преобразовать в объект datetime.datetime - PullRequest
0 голосов
/ 05 августа 2020

Я хочу считать дни до дня рождения. У меня есть строка с датой рождения:

"1949-10-09T00:25:51.304Z"

и

tday = datetime.now().isoformat()

, которая возвращает

2020-08-05T21:02:31.532123
<class 'str'>

, и мне интересно, как создать дельта-время этих двух строки.

Я вижу разницу между этими строками:

"1949-10-09T00:25:51.304Z"     # date of birth
"2020-08-05T21:02:31.532123"   # today

Нужно ли мне менять строку «сегодня» (фрагмент, чтобы получить:

"2020-08-05T21:02:31.532"

, а затем объедините «Z», чтобы получить:

"2020-08-05T21:02:31.532Z"

, а затем преобразовать это в объект с помощью datetime.strptime () и преобразовать дату дня рождения в дату объекта, используя это?

birthday = datetime.fromisoformat('1949-10-09T00:25:51.304Z')

Или есть более умный способ сделать это?

Чтобы получить строку дня рождения, я должен использовать эту функцию, которая анализирует JSON файл.

date=get_double_nested_table_data(0, "dob", "date")
birthday = datetime.fromisoformat(date)
now = datetime.now()
delta = now - birthday

Это не работает.

Я сделал это, используя ответ ниже:

def get_days_until_birthday(index: int, first_table: str, second_table: str):
    birthday_str = get_double_nested_table_data(index, first_table, second_table)
    birthday = datetime.strptime(birthday_str, "%Y-%m-%dT%H:%M:%S.%fZ")
    now = datetime.now()
    delta = now - birthday
    return delta.days

, который возвращает такие строки: странные целые числа

Я изменил эту функцию на эту:

def get_days_until_birthday(index: int, first_table: str, second_table: str):
    now = datetime.now()
    year = now.year
    birthday_str = get_double_nested_table_data(index, first_table, second_table)
    birthday_str = str(year) + birthday_str[4:]
    birthday = datetime.strptime(birthday_str, "%Y-%m-%dT%H:%M:%S.%fZ")
    now = datetime.now()
    delta = now - birthday
    return delta.days

, и это отлично работает, только если день рождения наступит в этом году. Эта функция не возвращает правильные дни, если день рождения будет в следующем году. * 1 041 *

Не могли бы вы это изменить?

1 Ответ

1 голос
/ 05 августа 2020

То, что вы хотите, - это вычесть два datetime, которые дают вам timedelta между ними

from datetime import datetime

birthday_str = '1949-10-09T00:25:51.304Z'
# you can remove the Z by slicing
birthday = datetime.fromisoformat(birthday_str[:-1])
# or with strptime
birthday = datetime.strptime(birthday_str, "%Y-%m-%dT%H:%M:%S.%fZ")
now = datetime.now()
delta = now - birthday

# return the number of days (positive) there is between now and birthday date
return (now - birthday).days if birthday < now else (birthday - now).days

формат strptime ссылка :

% Y год в 4 цифрах его * % m * месяц в 2-х значном формате % d день в 2-х цифрах T , чтобы по-прежнему соответствовать формату строки, которую вы используете % H это час : , чтобы по-прежнему соответствовать формату строки, которую вы используете % M - минуты % S для секунд . , чтобы по-прежнему соответствовать формату строки, которую вы используете % f для микросекунд Z , чтобы по-прежнему соответствовать формату строки, которую вы используете

...