8

Javascript API 呼び出しを Python に変換しようとしています。動作中の JavaScript コードは正常に動作し、次のようなタイムスタンプを生成します。

var curdate = new Date();
var gmtstring = curdate.toGMTString();
var utc = Date.parse(gmtstring) / 1000;

この結果 (エポックからのこの秒数) は、その後ハッシュされ、API 呼び出しで使用されますが、これは関連するセクションです。誰かがこれを変換する正しい方法を私に知らせることができれば、それは大歓迎です.

さまざまな方法によるさまざまな結果の詳細を次に示します。

Javascript(有効な API の結果)

var curdate = new Date(2013, 7, 10);
var gmtstring = curdate.toGMTString();
var utc = Date.parse(gmtstring) / 1000;

結果: 1376089200

Python (無効な API 結果)

from datetime import datetime
import calendar

d = datetime(2013, 8, 10)
calendar.timegm(d.utctimetuple())

結果: 1376092800

私は明らかに何かが欠けています。誰かがこれについて教えてくれますか?

アップデート

Javascript は 0 ベースの日付を使用し、Python の日付は 1 ベースであるため、私は最初に私の例で間違いを犯しました。

Jonathon は、Javascript がデフォルトでローカル タイムゾーンを使用するのに対し、Python がデフォルトで UTC を使用するため、値の違いが異なることを親切に説明してくれました。私の場合、これは GMT であり、これは API が必要とするものです。この結果を Python で取得する必要があります。

答え

解決策は、提供されているタイムゾーンの不一致でした。サードパーティの API にはまだ問題がありますが、少なくとも今は正しい時間を取得しています。

これはおそらくクリーンアップできます。

from datetime import datetime
import calendar
import time
import pytz

def GenerateTimeStamp(d):
    europe = pytz.timezone('Europe/London')
    d = europe.localize(d)
    tuple = d.utctimetuple()
    timestamp = int(time.mktime(tuple))
    return timestamp

日時を指定するだけです:

GenerateTimeStamp(datetime(2013, 8, 10))

また

GenerateTimeStamp(datetime.utcnow())

補足として、これを試していて、pip を使用して pytz 1をインストールしたい場合は、 pre タグ2を使用して取得できます。

pip install --pre pytz
4

3 に答える 3

8

JavaScript 日付の場合、month引数は 0 から 11です。したがって、8 月は に合格する必要があります7

1 月の 0 から 12 月の 11 までの、月を表す整数値。

また、デフォルトのタイムゾーンも異なります。Python のデフォルトは UTC ですが、JavaScript のデフォルトはユーザーの「local」タイムゾーンです。

Date.UTC()タイムスタンプを返す を、JavaScript で同等のものとして使用できます。

var utc = Date.UTC(2013, 7, 10) / 1000;
// 1376092800

補足:getTime()のタイムスタンプを取得するために使用できますDate

var curdate = new Date(2013, 7, 10);
var utc = curdate.getTime() / 1000;
于 2013-08-10T10:11:22.913 に答える
3

new Date(2013, 8, 10)javascript では、2013 年 9 月 10 日を意味します。

datetime(2013, 8, 10)Python では、2013 年 8 月 10 日を意味します。

2 つの異なる日付を比較しています。

現地時間と UTC

結果は異なる場合があります (私のシステムのタイムゾーン: Asia/Seoul)。

JavaScript

> new Date(2013, 7, 10) / 1000
1376060400
> Date.UTC(2013, 7, 10) / 1000
1376092800

パイソン

>>> import calendar
>>> import datetime
>>> import time
>>> time.mktime(datetime.datetime(2013, 8, 10).timetuple())
1376060400.0
>>> calendar.timegm(datetime.datetime(2013, 8, 10).timetuple())
1376092800

Python - calendar.timegm() と time.mktime()を参照してください。

于 2013-08-10T10:11:12.037 に答える
1

上記のジョナサンの回答に加えて、Python 側でこれをお勧めします。

 d = datetime(2013, 8, 10)
 d.strftime("%s")

それが返されます: '1376107200'

于 2013-08-10T10:27:16.863 に答える