Как мне получить текущую дату и текущее время только в Django соответственно?


81

При использовании этого класса я столкнулся с интересной ситуацией:

class Company(models.Model):
    date = models.DateField()
    time = models.TimeField()
c = Company(date=datetime.datetime.now(), time=datetime.datetime.now()) 

Django решает использовать файлы, DATETIME_INPUT_FORMATSопределенные в файле sizes.py . Это имеет смысл, потому что я перехожу datetime.now()к обоим полям.

Думаю, я мог бы заставить Django использовать DATE_INPUT_FORMATSи, TIME_INPUT_FORMATSсоответственно, если бы я передал только текущую дату и текущее время в.

Что-то вроде этого:

c = Company(date=datetime.date.now(), time=datetime.time.now()) 

Но это явно вызывает исключение, поскольку сейчас такого не существует. Есть ли другой способ добиться этого?

Ответы:


146

Для даты вы можете использовать datetime.date.today()или datetime.datetime.now().date().

На время можно использовать datetime.datetime.now().time().


Однако зачем вообще нужны отдельные поля для них? Почему бы не использовать сингл DateTimeField?

Вы всегда можете определить вспомогательные функции в модели, которые возвращают .date()или .time()позже, если вам нужен только один или другой.


Работает Эмбер большое спасибо. :) Принимаю за 5 мин. Причина, по которой мне это нужно, заключается в интернационализации и переводе американских форматов времени и даты на остальные миры. :)
Houman

5
Для поддержки часового пояса я думаю, что все же лучше использовать DateTimeField, чтобы всегда хранить дату и время в формате UTC, а затем переносить дату в текущий часовой пояс во время запроса.
Joucks

@Kave Да, что сказал пиук. Используйте DateTimeField, который хранит время в формате UTC и переводит только в соответствующий часовой пояс (используя что-то вроде pytz), когда вы переходите к отображению времени. Это не только лучший способ хранения, но и бесплатная обработка часовых поясов, потому что pytzэто уже было написано для вас.
Эмбер

64
import datetime
datetime.datetime.now().strftime ("%Y%m%d")
20151015

На время

from time import gmtime, strftime
showtime = strftime("%Y-%m-%d %H:%M:%S", gmtime())
print showtime
2015-10-15 07:49:18


6
 import datetime

Текущая дата и время

     print(datetime.datetime.now())
     #2019-09-08 09:12:12.473393

Только текущая дата

     print(datetime.date.today())
     #2019-09-08

Только текущий год

     print(datetime.date.today().year)
     #2019

Только текущий месяц

     print(datetime.date.today().month)
     #9

Только текущий день

     print(datetime.date.today().day)
     #8

1

Другой способ получить время в формате UTC с миллисекундами.

from datetime import datetime

datetime.utcnow().isoformat(sep='T', timespec='milliseconds') + 'Z'

2020-10-29T14:46:37.655Z

0

Связанная информация, к вопросу ...

В django используйте timezone.now()для поля datetime, поскольку django поддерживает часовой пояс , он просто возвращает datetime на основе USE TZнастроек или просто объекты datetime с учетом часового пояса

Для справки у меня есть TIME_ZONE = 'Asia/Kolkata'и USE_TZ = True,

from django.utils import timezone
import datetime

print(timezone.now())  # The UTC time
print(timezone.localtime())  # timezone specified time, 
print(datetime.datetime.now())  # default local time

# output
2020-12-11 09:13:32.430605+00:00
2020-12-11 14:43:32.430605+05:30  # IST is UTC+5:30
2020-12-11 14:43:32.510659

обратитесь к настройкам часового пояса и интернационализации и локализации в django docs для получения более подробной информации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.