Pythonは5分後のUNIXタイムスタンプを作成します


297

「Expires」値を5分後に作成する必要がありますが、UNIXタイムスタンプ形式で指定する必要があります。今のところこれはありますが、ハックのようです。

def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    epoch = datetime.datetime(1970, 1, 1)
    seconds_in_a_day = 60 * 60 * 24
    five_minutes = datetime.timedelta(seconds=5*60)
    five_minutes_from_now = datetime.datetime.now() + five_minutes
    since_epoch = five_minutes_from_now - epoch
    return since_epoch.days * seconds_in_a_day + since_epoch.seconds

タイムスタンプ変換を行うモジュールまたは関数はありますか?


7
この質問の件名を変更することをお勧めします。問題は良いですが、日時をUnixタイムスタンプに変換することについてではありません。5分後のUnixタイムスタンプを取得する方法についてです。
DA 2013年

私は同意しません、@ DA質問は基本的に「私はXとYを行う必要があります。これが今あるものです。Yを行うためのより良い方法は何ですか?」たぶんXを行うには良い方法がありますが、タイトルと本文を明確Y.について質問
ロブ・ケネディ

6
私はその質問について完全にあなたに同意します、そして私はそれが良い答えを持つ良いものだと思います。問題は、「Pythonの日時からUnixのタイムスタンプ」が質問も回答も反映していないことです。この投稿で変換を行う方法を探していたところ、誤解を招く件名のせいで時間を失いました。「Python、UNIXタイムスタンプとして5分後」
DA

3
@JimmyKane -日付時刻からタイムスタンプを取得する方法についてかなり包括的な答えはここで見つけることができますA: stackoverflow.com/questions/8777753/...
ティムTisdall

@TimTisdallはい、タイトルが変更されたので意味がありません
Jimmy Kane

回答:


349

別の方法は使用することcalendar.timegmです:

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return calendar.timegm(future.timetuple())

また、%sフラグよりも移植性がありますstrftime(Windowsでは機能しません)。


D.Shawleyに感謝します。help(datetime.timedelta)はそのショートカットについて言及していません。日、秒、マイクロ秒しかありませんでした。
Daniel Rhoden、

12
前の2つのコメントを組み合わせると、正しい解決策は次のとおりcalendar.timegm(future.utctimetuple())です。これにより、UTC時間が確実に渡されcalendar.timegmます。
shadowmatter 2013年

1
@tumbleweedのコメントに賛成できません。UNIXタイムスタンプ(つまり、UTCのタイムスタンプ)を取得しようとしている場合は、calendar.timegmを使用します。
Bialecki 2013

@tumbleweed、そうです。mktimeとgmtime(0)を使用すると、UTC以外のタイムゾーンのラウンドトリップデルタがゼロ以外になります。例: `time.mktime(datetime.fromtimestamp(time.mktime(time.gmtime(0)))。timetuple())` 21600.0UNIXマシンのTZに0.0ではなく秒(6時間)を与える
2013年

UTCタイムスタンプを取得する場合は、次を使用する必要がありますcalendar.timegm(datetime.datetime.utcnow().timetuple())。使用する方法datetime.datetime.now().utctimetuple()は私のために動作しません(Python 3.2)。
Wookie88 2013

155

Python> = 3.3ではtimestamp()メソッドを呼び出すだけで、タイムスタンプを浮動小数点数として取得できます。

import datetime
current_time = datetime.datetime.now(datetime.timezone.utc)
unix_timestamp = current_time.timestamp() # works if Python >= 3.3

unix_timestamp_plus_5_min = unix_timestamp + (5 * 60)  # 5 min * 60 seconds

4
+1。Python 3でそれを行うためのクリーンな方法であるため、これははるかに高く表示されるはずです
ViktorStískala2013年

2
@ scott654コメントの冒頭に正しく書いておけばわかりやすいと思いましたが、太字も追加しました。
Tim Tisdall

1
私たちはコードブロックのコメントとしてメモを作成します。なぜなら、私たちは全員、最初に回答のコードをスキャンし、コードが良さそうな場合にのみ残りを読むからです。良い答えですが。
マシューパードン2013年

2
現地時間があいまいかもしれません。例(datetime.now())は、現地時間を表す単純なdatetimeオブジェクトの使用を奨励し、(固有のあいまいさのため)DSTの移行中に失敗する可能性があるため、悪い例です。ts = datetime.now(timezone.utc).timestamp()代わりに使用できます。
jfs 2013年

@JFSebastian-良い点。インポートに追加したくなかったので、に変更しましたutcnow()。私はタイムゾーンがUTCに設定されているマシンでの作業に慣れていますが、このコードスニペットではそれを前提とすべきではありません。
Tim Tisdall 2013年

139

これを見つけただけで、さらに短くなりました。

import time
def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    return int(time.time()+300)

12
これは質問の答えにはなりません。
Jesse Dhillon、2012

22
@JesseDhillonは、タイトルではなく、質問に回答します(UNIXタイムスタンプを5分後に作成します)。
dbr、2012

3
time.time()後退できます。5分後に「有効期限」の値を作成するtime.monotonic()には、ユースケースによってはアナログが必要になる場合があり ます。
jfs 2012

@ jf-sebastian time.monotonic()はUNIXタイムスタンプを返さず、未定義の参照ポイントのタイムスタンプを返します。
rspeer 2013年

@rspeer:はい、ドキュメントが言うように、連続した呼び出し間の違いのみが有効です。monotonic使用できるかどうかは、ユースケースに依存します。たとえば、subprocessモジュールはtimeoutオプションを実装するために使用します。
jfs 2013年

57

これはあなたが必要とするものです:

import time
import datetime
n = datetime.datetime.now()
unix_time = time.mktime(n.timetuple())

これはどのように違うのですか、または提供されている「Cat Plus Plus」に追加されますか?
デビッド

3
たとえば、これは「Python日時からUnixタイムスタンプ」への回答ですが、Cat Plus Plusは「Python日時からUnixタイムスタンプまで5分以内」という質問への回答です。したがって、これはクリーンで明白です。
running.t 2013年

@ running.t:それは私に思い出させます:「すべての問題には単純で明白で間違った解決策があります」。で発生する可能性のある問題を確認しmktime(dt.timetuple())ます。datetime.now(timezone.utc).timestamp()@Tim Tisdallが提供するのは、Python 3.3以降のソリューションです。それ以外の場合(dt - epoch).total_seconds()は使用できます
jfs

@JFSebastianすべての計算を現地時間で実行したい場合はどうすればよいですか?それは例です。ローカルタイムであることがわかっている単純な文字列を解析し、その特定の時間にDSTが有効であったかどうかを判断するにはどうすればよいですか。
n611x007 2014年

1
@naxa:はい、一部の現地時間はあいまいであるか、存在しません。また、タイムゾーンオフセットは、DST以外の理由で異なる場合があります(正しいオフセットを見つけるには、pytzなどのtzデータベースが必要です)。現地時間とは、地元の政治家が時間を測定するために良い考えであると考えているもの、つまり、非常に不規則である可能性があることを意味します。
jfs

48

形式文字列datetime.strftimeを使用して、エポック形式で時刻を取得でき%sます。

def expires():
    future = datetime.datetime.now() + datetime.timedelta(seconds=5*60)
    return int(future.strftime("%s"))

注:これはLinuxでのみ機能し、この方法はタイムゾーンでは機能しません。


32
これはやや文書化されていない動作です(python.org/doc/current/library/datetime.html)。Linuxで動作しており、win32(生成中ValueError: Invalid format string)では動作していないようです。
Antony Hatchkins、

3
このメソッドはタイムゾーンでは機能しません。タイムゾーンを変更すると、同じ結果が得られますdatetime(2013,12,7、tzinfo = timezone( "America / Chicago"))。strftime( "%s")1386385200 datetime(2013,12,7、tzinfo = timezone( "Europe / Riga "))。strftime("%s ")1386385200
Martins

11

以下はdatetime、datetimeオブジェクトからposixタイムスタンプに変換する、それほど壊れていないベースのソリューションです。

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return (future - datetime.datetime(1970, 1, 1)).total_seconds()

詳細については、Pythonでのdatetime.dateからUTCタイムスタンプへの変換をご覧ください。


6
def in_unix(input):
  start = datetime.datetime(year=1970,month=1,day=1)
  diff = input - start
  return diff.total_seconds()

4

重要なのは、変換を開始する前に、使用しているすべての日付がutcタイムゾーンであることを確認することです。適切に行う方法については、http://pytz.sourceforge.net/を参照してください。utcに正規化することにより、夏時間の移行のあいまいさを排除できます。その後、timedeltaを使用してUNIXエポックからの距離を安全に計算し、秒またはミリ秒に変換できます。

結果のUNIXタイムスタンプ自体はUTCタイムゾーンであることに注意してください。ローカライズされたタイムゾーンでタイムスタンプを表示したい場合は、別の変換を行う必要があります。

また、これは1970年以降の日付でのみ機能することにも注意してください。

   import datetime
   import pytz

   UNIX_EPOCH = datetime.datetime(1970, 1, 1, 0, 0, tzinfo = pytz.utc)
   def EPOCH(utc_datetime):
      delta = utc_datetime - UNIX_EPOCH
      seconds = delta.total_seconds()
      ms = seconds * 1000
      return ms

3
注:「ローカライズされたタイムゾーンの[UNIX]タイムスタンプ」がわかりません。タイムスタンプは同じです(からの経過秒数1970-01-01 00:00:00+00:00)。ローカルタイムゾーンで単純なdatetimeオブジェクトを取得するには、次のようにしますdatetime.fromtimestamp(ts)
。– jfs

4

以下は、上記の回答(およびミリ秒の修正)に基づいており、datetime.timestamp()タイムゾーンが使用されている場合、3.3より前のPython 3 をエミュレートします。

def datetime_timestamp(datetime):
    '''
    Equivalent to datetime.timestamp() for pre-3.3
    '''
    try:
        return datetime.timestamp()
    except AttributeError:
        utc_datetime = datetime.astimezone(utc)
        return timegm(utc_datetime.timetuple()) + utc_datetime.microsecond / 1e6

質問に厳密に答えるには、次のようにします。

datetime_timestamp(my_datetime) + 5 * 60

datetime_timestampsimple-dateの一部です。しかし、そのパッケージを使用している場合は、おそらく次のように入力します。

SimpleDate(my_datetime).timestamp + 5 * 60

my_datetimeのより多くのフォーマット/タイプを処理します。


(5 * 60)を追加して5分を追加しないでください。5を追加するだけで、タイムスタンプに5秒しか追加されないと思います。
Tim Tisdall 2013

1
def expiration_time():
    import datetime,calendar
    timestamp = calendar.timegm(datetime.datetime.now().timetuple())
    returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
    return returnValue

1

ソリューションはtimedelta.total_seconds()python-2.7 + で動作することに注意してください。calendar.timegm(future.utctimetuple())Pythonの下位バージョンに使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.