2013-06-13 89 views

回答

13

https://docs.djangoproject.com/en/dev/ref/models/fields/#datetimefield

一個日期和時間,通過一個datetime.datetime實例在Python表示。

你可以得到一個DateTimeField字段的字符串表示直接澆鑄:

str(obj) 
# obj = qs[0][0] ? or qs[0][1] ? 

你會得到結果像這樣(在這個例子中,我使用datetime.datetime.now()因爲DateTimeField字段是通過datetime.datetime代表的是同樣的行爲):

>>> now = datetime.datetime.now() 
>>> str(now) 
'2013-06-26 00:14:26.260524' 
如果你想爲他們格式的信息較少或以其他方式格式化的,你可以使用的strftime()函數

。請參閱:

>>> now.strftime('%Y-%m-%d %H:%M') 
'2013-06-26 00:14' 
+1

有沒有什麼辦法讓月直接在文本的時間(例如11 = 11月)? – dietbacon

+0

@dietbacon你試過'now.strftime('%B')'? –

3

如果您使用的是Postgres,可以這樣做(date format options here)。該解決方案依賴於數據庫,但在執行查詢之後,它肯定會跳過Python列表中的長列表循環。

qs = MyModel.objects.filter(name='me') 
qs = qs.extra(select={'datestr':"to_char(activation_date, 'YYYY-MM-DD HH24:MI:SS')"}) 
qs = qs.values_list('datestr') 

我相信MySQL有一些相同功能的Postgres的的TO_CHAR,但你必須找到你自己的,因爲我不是一個MySQL的傢伙。

3
qs = MyModel.objects.filter(name='me') 
qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%Y-%m-%d')"}) 
qs = qs.values_list('datestr') 
+0

第二行應該是: ''qs = qs.extra(select = {'datestr':'DATE_FORMAT(activation_date,'%% Y - %% m - %% d')「}) ''' – user2002692

0

您還可以使用map函數將queryset中的日期轉換爲字符串。例如:

qs = MyModel.objects.filter(name='me').values_list('activation_date', flat=True) 
data = map(str, qs) 
1

extra是在Django 2棄用。0

這就是爲什麼我認爲最好的辦法來獲得字符串化的日期時間爲:

foo_bar = FooBarModel.objects.annotate(
    str_datetime=Cast(
     TruncSecond('some_datetime_field', DateTimeField()), CharField() 
    ) 
).values('str_datetime').first() 

結果是

foo_bar.str_datetime: 
(str)'2014-03-28 15:36:55' 

此外,我想提你可以用任何你喜歡的方式格式化它:

from django.db.models import Value 

foo_bar = FooBarModel.objects.annotate(
    day=Cast(ExtractDay('some_datetime_field'), CharField()), 
    hour=Cast(ExtractHour('some_datetime_field'), CharField()), 
    str_datetime=Concat(
     Value('Days: '), 'day', Value(' Hours: '), 'hour', 
     output_field=CharField() 
    ) 
).values('str_datetime').first() 

結果是

foo_bar.str_datetime: 
(str)'Days: 28 Hours: 15' 
相關問題