Форматируйте datetime и возвращайте datetime python (без промежуточного шага строки)

#python-3.x #datetime #python-datetime

Вопрос:

У меня есть тип данных datetime, и я хочу отформатировать его как тип данных datetime, но я мог бы просто найти, как это сделать, если я это сделаю datetime-> string-> datetime , и я хочу сделать это напрямую datetime->datetime . Возможно ли это?

Это мой код:

 from datetime import datetime

start_date = datetime.now()
res = datetime.strptime(start_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), "%Y-%m-%dT%H:%M:%S.%fZ")
 

Комментарии:

1. не могли бы вы уточнить, что вы подразумеваете под » Я хочу отформатировать его как дату и время»? Обратите внимание, что объекты datetime не имеют формата , например, который может иметь строка. Это структуры данных для хранения информации о дате и времени. И у них есть __str__ метод, который вызывается при их печати, который показывает сохраненную дату/время в определенном формате.

2. Я также отметил, что у вас есть Z директива форматирования; если вам нужен объект datetime, представляющий UTC, используйте datetime.now(timezone.utc) (после импорта timezone класса из модуля datetime).

3. Привет, мистер Купс! В своем решении я передаю строку, а затем преобразую ее обратно в дату и время. Мне было интересно, можно ли получить объект datetime и преобразовать его в datetime напрямую, не передавая в виде строки. Например, формат datetime.format(строка), который возвращает дату и время; О «Z» я не могу изменить, это директива контракта, которая должна быть такой, поскольку моя исходная дата выглядит так: 2020-01-01T00:00:00.000 00:00Z, и я хочу формат %Y-%m-%dT%H:%M:%S.%fZ 🙂

4. таким образом, вы получаете дату/время из какого-либо API в виде строки типа данных? Если это так, то для изменения типа данных потребуется изменить API, не так ли?

5. вы имеете в виду, что получаете объект datetime, т. е. тип данных datetime ? а другой API, чего я ожидаю? струна? объект datetime?

Ответ №1:

вы можете получить некоторое удобство, используя методы изоформата datetime:

 from datetime import datetime

# input date/time as string
s = "2020-01-01T00:00:00.000 00:00Z"

# to datetime object
# we can strip Z (zulu) since Python treats  00:00 as UTC already
dtobj = datetime.fromisoformat(s.strip('Z'))

print(repr(dtobj))
# datetime.datetime(2020, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)

# back to string, format as input
# add the Z since this is not supported in Python by default
s_out = dtobj.isoformat(timespec='milliseconds')   'Z'

print(s_out)
# 2020-01-01T00:00:00.000 00:00Z
 

Комментарии:

1. Спасибо за ваш ответ, но в моем случае ваша переменная «s» — это дата-время в том формате, который вы написали. Я хочу преобразовать переменную «s», которая является временем даты, в формат «%Y-%m-%dT%H:%M:%S.%fZ», возвращающий время даты. Но поскольку я получаю переменную «s» в качестве даты-времени и мне нужно вернуть дату-время, я не хочу преобразовывать ее в строку, потому что для меня это не имеет смысла

2. @CatarinaNogueira итак, вы получаете объект datetime, как dtobj в моем примере. В нем указано UTC (Z/zulu). Но у него нет формата ; см. Мой первый комментарий к вопросу. Мы должны быть точны в формулировках, чтобы знать, о чем мы говорим 😉 Если этого ожидает API, в который вы передаете данные, вам не нужно ничего делать, так как вы не можете изменить какой-либо формат (только атрибуты, например, tzinfo).

3. Еще раз здравствуйте! Спасибо, что уделили мне время и ответили. Теперь понял :)))