2016-11-14 11 views
1

私は、REST呼び出しにPythonで時間形式を追加しようとしていますが、問題の種類が常にあるようです。時間フォーマット要件、およびそれは正確でなければならない、またはそれは残念ながら働かないだろう。奇妙な時間形式を維持し、Pythonで値を追加する

要求パラメータには、次のISO-8601に準拠した日付/時刻形式を使用します。

YYYY-MM-dd'T'HH:MM:ss.SSSXXX例えば

、2014年5月26日午後九時49分46秒PMには、次のいずれかのような形式を持つことができます:

をPDTにおいて

L:2014-05-26T21:49:46.0​​00から07:UTC 00

L:2014-05-26T21:49:46.0​​00Z

コード説明

  • YYYY 4桁の年
  • MM 2桁の月(01 = 1月、など)
  • DD(01〜31)月の二桁の日
  • T日付/時刻の区切り
  • HH時間の2桁(00〜23)(AM/PMが許可されていない)分の
  • ミリメートル2桁(00〜59)
  • のSS第二の2桁(00〜59)は、第2
  • XXX ISO 8601タイムゾーンの
  • SSS 3桁のミリ秒(Zまたは+ HH:MMまたは-hh:mm)で

したがって、私が前に試したことは次のとおりです:

def format_time(self, isnow): 
    currentdt = datetime.datetime.utcnow() 
    if not isnow: 
     currentdt += datetime.timedelta(0,3) 
    (dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.') 
    dt = "%s.%03dZ" % (dt, int(micro)/1000) 
    return dt 

これはちょっと正しい形式で返されるかもしれませんが、まだタイムゾーンに問題があります。

私が達成しようとしているのは、これを実行すると、現在の時刻(アムステルダムタイムゾーン/ GMT/UTC + 1)が見つかって、この形式で作成されます。 そして、else文は、同じ時刻を取得しますが、X秒を追加します。

ここで私を助けてくれる人は誰ですか?

+0

あなたの問題を解決することはできませんが、あなたのコードを簡単に保守することができます(問題は簡単に答えられます): 'currentdt = datetime.datetime.utcnow()' 'if not:currentdt + = datetime。 timedelta(0,3) ''(dt、etc ... 'つまり、ifブロック内の唯一のものは、timedeltaを追加するだけで、時間をフォーマットする時間を分けます。あなたが望むならあなたの質問にあなたのために(通常、編集者はコードブロックを変更しないので、彼らは質問を変えています。)私はそこにいる間に不要な下品を編集します。 –

+0

@ 私はあなたの他のポイントを理解していれば、私が現在試みているものをもっと簡略化したフォーマットに変更して、誰かが私に答えを提示できるかどうかを見てみたいですか? – Marius

+0

これは推奨事項であり、要件ではありません。よりシンプルな形式を使用すると、1行のコードを修正するだけで済みます。それはあなたが投稿した10行のうち、3行は他の3行のコピーです。そして、問題は3行にあるので、そのように対処するのはよりクリーンです。私は変更を加えるつもりです。なぜなら、コメントよりも質問に入れるほうが簡単だからです。気に入らない場合は、「編集したX分前」をクリックしてロールバックしてください。 –

答えて

1

[OK]をクリックすると、ミリ秒単位でフォーマットされたマイクロ秒が得られます。

ここで、タイムゾーンのオフセットを処理することが課題です。

strftime%zフォーマットでは、HH:MMの代わりに+(または - )のHHMMが得られます。

だから、それに対処する必要があります。ここではそれを行うための一つの方法です:

のPython 3:

def format_time(self, isnow): 
    currentdt = datetime.datetime.now(datetime.timezone.utc) 
    if not isnow: 
     currentdt += datetime.timedelta(0,3) 
    (dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.') 
    tz_offset = currentdt.astimezone().strftime('%z') 
    tz_offset = "Z" if tz_offset == "" else tz_offset[:3] + ":" + tz_offset[3:] 

    dt = "%s.%03d%s" % (dt, int(micro)/1000, tz_offset) 
    return dt 

のPython 2:コメントする

import pytz 
from dateutil.tz import * 

def format_time(self, isnow): 
    currentdt = datetime.datetime.now(pytz.utc) 
    if not isnow: 
     currentdt += datetime.timedelta(0,3) 
    (dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.') 
    tz_offset = currentdt.astimezone(tzlocal()).strftime('%z') 
    tz_offset = "Z" if tz_offset == "" else tz_offset[:3] + ":" + tz_offset[3:] 

    dt = "%s.%03d%s" % (dt, int(micro)/1000, tz_offset) 
    return dt 

応答: 私はいくつかの変更を行うために必要な。現在のタイムゾーンを見つけることは非常に重要ではありません。私が見つけた最も簡単な方法はhttps://stackoverflow.com/a/25887393/1404311でした。私はそれらのコンセプトを上のコードに統合しました。

基本的にutcnow()の代わりにnow(datetime.timezone.utc)を使用してください。前者は素朴な日時を与えますが、後者は日時をUTCに設定しますが、それは認識しています。次に、astimezone()を使用してローカルタイムゾーンを認識させてから、strftime('%z')を使用してオフタイムを取得します。次に文字列の操作を行います。

+0

ええと、これは実行可能だと思われますが、まず、他に何を意味するのでしょうか? tz == "else"なら 'tz =" Z "。 これは私にエラーを与えるでしょう。 また、これは正しいタイムゾーンにどのように変換することができますか? utcnowの時刻はいつも同じですか?また、時刻形式の最後に余分な "00:00"を追加すると、変換されますか? – Marius

+0

Ack。申し訳ありませんが、私は自分のコードを編集し終わっていない理由がわかりません。修正しました... –

+0

これで、私の編集内容は、現在、より多くのタイムゾーンの認識を提供するはずです。 :-) –

関連する問題