37

モデルには、次のようなフィールドがあります: mydate = models.DateField()

現在、javascript グラフ関数は「1196550000000」などの UNIX タイムスタンプを必要としています。mydate 入力の UNIX タイムスタンプを返すにはどうすればよいですか。

ありがとう

4

6 に答える 6

108

少し前に別の回答が受け入れられたことは知っていますが、この質問は Google の検索結果で上位に表示されるため、別の回答を追加します。

テンプレート レベルで作業している場合は、次のようにUパラメーターdateフィルターに使用できます。

{{ mydate|date:"U" }}

TIMEZONEsettings.py の に基づいていることに注意してください。

于 2010-07-31T01:44:11.830 に答える
70

また、テンプレート層にいない場合でも、同じ基礎となる django ユーティリティを使用できます。元:

from django.utils.dateformat import format
print format(mymodel.mydatefield, 'U')
于 2011-09-12T11:17:02.700 に答える
28

編集:2番目の回答を確認してください。はるかに優れた解決策があります

Pythonコードでは、これを実行して日付または日時をUnixエポックに変換できます

import time
epoch = int(time.mktime(mydate.timetuple())*1000)

ただし、これは Django テンプレートでは機能しないため、次のようなカスタム フィルターが必要です。

import time

from django import template

register = template.Library()

@register.filter
def epoch(value):
    try:
        return int(time.mktime(value.timetuple())*1000)
    except AttributeError:
        return ''
于 2009-08-11T09:45:05.083 に答える
6

では、次のように の値を Unix エポックからの秒数views.pyに変換できます。mydate

seconds = time.mktime(mydate.timetuple())

次に、引数として使用する辞書render_to_response()(またはビューをレンダリングするために使用しているもの)にそれを渡し、テンプレートで{{seconds}}隠しフィールドに貼り付けます。これにより、DOMから引き出してJavaScriptに渡すことができますグラフ機能。

DateFieldaは Python objectdatetime.dateにマップされることに注意してください。そのtimetupleため、時間、分、および秒のフィールドが 0 に設定されます。それが十分にきめの細かいものでない場合はmydate、DateTimeField に変更する必要があります。であるdatetime.datetimemydate.timetuple()このまま行けばまだまだ使えます。

また、現地時間を使用していると仮定しています。UTC 時間を使用している場合は、 andではなくcalendar.gmtime()が必要ですが、これはオブジェクトに対して有効なメソッドにすぎません。面倒な詳細については、ドキュメント (およびも参照) を参照してください。time.mktime()mydate.utctimetuple()mydate.timetuple()utctimetuple()datetime.datetimedatetimetimecalendar

mktime()編集: piquadratが覚えていて、私が覚えていなかったfloatを返すという事実などの面倒な詳細。カスタム フィルターのアプローチも優れています。それを投票します。

于 2009-08-11T09:35:22.047 に答える
1

別のオプション:

import time
from django.utils import timezone

naive_date = timezone.make_naive(mydate, timezone.get_current_timezone())
print int(time.mktime(naive_date.timetuple()))
于 2016-10-17T22:07:32.943 に答える