web-dev-qa-db-ja.com

django日付フィールドからUnixタイムスタンプへ

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

現在、JavaScriptグラフ関数には "1196550000000"などのUNIXタイムスタンプが必要ですが、mydate入力のUNIXタイムスタンプを返すにはどうすればよいですか。

ありがとう

35
Hellnar

編集: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 ''
28

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

テンプレートレベルで作業している場合は、 U parameterdateフィルターに使用できます。例:

{{ mydate|date:"U" }}

これは、settings.pyのTIMEZONEに基づいていることに注意してください。

103
John Paulett

また、テンプレートレイヤーにいない場合でも、同じ基礎となるDjango utilsを使用できます。例:

from Django.utils.dateformat import format
print format(mymodel.mydatefield, 'U')
67
Mike Fogel

_views.py_では、次のようにmydateの値をUnixエポック以降の秒数に変換できます。

_seconds = time.mktime(mydate.timetuple())
_

次に、それをrender_to_response()(またはビューのレンダリングに使用しているもの)の引数として使用するディクショナリに渡し、テンプレートで_{{seconds}}_を非表示フィールドに貼り付けます。次に、DOMから取り出して、JavaScriptグラフ関数に渡します。

DateFieldはPythonオブジェクト_datetime.date_にマップするため、そのtimetupleには時間、分、秒のフィールドが設定されます。それが十分にきめ細かくない場合は、mydateをDateTimeFieldに変更する必要があります。これは_datetime.datetime_になります。引き続きmydate.timetuple()を使用できます。これを行う場合。

また、現地時間を使用していることを前提としています。 UTC時間を使用している場合、calendar.gmtime()ではなくtime.mktime()mydate.utctimetuple()ではなくmydate.timetuple()が必要ですが、utctimetuple()は単なる_datetime.datetime_オブジェクトの有効なメソッド。詳細については datetime docs(またtimeおよびcalendar)を参照してください。

編集:mktime()がfloatを返すという詳細など、piquadratは覚えていましたが、私はしませんでした。カスタムフィルターのアプローチも良いものです。投票してください。

別のオプション:

import time
from Django.utils import timezone

naive_date = timezone.make_naive(mydate, timezone.get_current_timezone())
print int(time.mktime(naive_date.timetuple()))
1
serg