Jak uzyskać aktualną datę i czas tylko odpowiednio w Django?

81

Podczas korzystania z tej klasy natknąłem się na ciekawą sytuację:

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

Django decyduje się na użycie DATETIME_INPUT_FORMATSzdefiniowanego w pliku functions.py . Co ma sens, ponieważ przechodzę datetime.now()do obu pól.

Myślę, że mógłbym sprawić, by Django używał DATE_INPUT_FORMATSi TIME_INPUT_FORMATSodpowiednio, gdybym podał tylko aktualną datę i aktualny czas.

Coś takiego:

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

Ale to oczywiście rzuca wyjątek, ponieważ teraz tak nie istnieje. Czy można to osiągnąć w inny sposób?

Houman
źródło

Odpowiedzi:

146

Na randkę możesz użyć datetime.date.today()lub datetime.datetime.now().date().

Na razie możesz użyć datetime.datetime.now().time().


Jednak po co w ogóle mieć osobne pola dla nich? Dlaczego nie skorzystać z jednego DateTimeField?

Zawsze możesz zdefiniować funkcje pomocnicze w modelu, które zwracają wartość .date()lub .time()później, jeśli chcesz tylko jedną lub drugą.

Bursztyn
źródło
Amber działa, wielkie dzięki. :) Można przyjąć w 5 min. Powodem, dla którego potrzebuję tego w ten sposób, jest umiędzynarodowienie i przetłumaczenie amerykańskich formatów czasu i daty na resztę świata. :)
Houman
5
W przypadku obsługi stref czasowych myślę, że nadal lepiej jest używać DateTimeField, aby zawsze przechowywać datę UTC, a następnie transponować datę do bieżącej strefy czasowej w czasie zapytania.
Joucks
@Kave Tak, co powiedział piouk. Użyj pola DateTimeField, które przechowuje UTC i tłumaczy tylko na odpowiednią strefę czasową (używając czegoś podobnego pytz), kiedy przejdziesz do wyświetlenia czasu. Jest to nie tylko lepszy sposób przechowywania, ale także obsługa strefy czasowej za darmo, ponieważ pytzzostała już napisana dla Ciebie.
Amber
64
import datetime
datetime.datetime.now().strftime ("%Y%m%d")
20151015

Na czas

from time import gmtime, strftime
showtime = strftime("%Y-%m-%d %H:%M:%S", gmtime())
print showtime
2015-10-15 07:49:18
Abdul Razak
źródło
26
import datetime

datetime.date.today()  # Returns 2018-01-15

datetime.datetime.now() # Returns 2018-01-15 09:00
Ethan Brimhall
źródło
2
Jak dotąd najlepsza odpowiedź!
Shougo Makishima
6
 import datetime

Bieżąca data i godzina

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

Tylko aktualna data

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

Tylko w bieżącym roku

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

Tylko w bieżącym miesiącu

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

Tylko bieżący dzień

     print(datetime.date.today().day)
     #8
Muhammad Faizan Fareed
źródło
1

Inny sposób na uzyskanie daty i godziny UTC z milisekundami.

from datetime import datetime

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

2020-10-29T14:46:37.655Z
Bruno Wego
źródło
0

Informacje pokrewne, do pytania ...

W django użyj timezone.now()dla pola datetime, ponieważ django obsługuje strefę czasową , po prostu zwraca datę i godzinę na podstawie USE TZustawień lub po prostu obiekty daty i godziny `` świadome '' strefy czasowej

Dla porównania mam TIME_ZONE = 'Asia/Kolkata'i 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

Więcej informacji można znaleźć w ustawieniach strefy czasowej oraz umiędzynarodowieniu i lokalizacji w dokumentacji django.

Akshay Chandran
źródło