Python 미래에 5 분 동안 유닉스 타임 스탬프 생성


297

앞으로 5 분 안에 "Expires"값을 만들어야하지만 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
이 질문의 주제를 변경하는 것이 좋습니다. 질문은 좋지만 datetime을 Unix 타임 스탬프로 변환하는 것은 아닙니다. 앞으로 5 분 안에 유닉스 타임 스탬프를 얻는 방법에 관한 것입니다.
DA

동의하지 않습니다. @DA이 질문에는 "X와 Y를 수행해야합니다. 지금 가지고있는 것이 있습니다. Y를 수행하는 더 좋은 방법은 무엇입니까?" 어쩌면 X를 할 수있는 더 나은 방법이 있지만, 제목과 본문은 분명히 Y.에 대해 질문
롭 케네디

6
나는 그 질문에 전적으로 당신에게 동의하고, 나는 그것이 좋은 대답을 가진 좋은 것이라고 생각합니다. 문제는 "Python datetime to Unix timestamp"는 질문이나 답변을 반영하지 않습니다. 이 게시물에서 변환을 수행하는 방법을 검색하는 것을 발견했으며 제목이 잘못되어 시간이 단축되었습니다. "파이썬, 5 분 후에 유닉스 타임 스탬프로"
DA

3
@JimmyKane-날짜 시간에서 타임 스탬프를 얻는 방법에 대한 매우 포괄적 인 답변은 여기를 참조하십시오 : stackoverflow.com/questions/8777753/…
Tim 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
앞의 두 의견을 결합하면 올바른 해결책은 다음과 같습니다 calendar.timegm(future.utctimetuple()). 이렇게하면 UTC 시간이로 전달됩니다 calendar.timegm.
shadowmatter

1
@tumbleweed의 의견을 충분히지지 할 수 없습니다. UNIX 타임 스탬프 (및 UTC)를 얻으려면 calendar.timegm을 사용하십시오.
Bialecki

@tumbleweed, 맞아. mktime과 gmtime (0)을 함께 사용하면 UTC 이외의 시간대에 대해 0이 아닌 왕복 델타가됩니다. 예 :`time.mktime (datetime.fromtimestamp (time.mktime (time.gmtime (0))) .. timetuple ())` 주는 21600.0내 유닉스 머신의 TZ 초 (6 시간) 대신 0.0
호브

UTC 타임 스탬프를 얻으려면 다음을 사용해야합니다 calendar.timegm(datetime.datetime.utcnow().timetuple()).. 사용하는 방법 datetime.datetime.now().utctimetuple()이 저에게 효과적이지 않습니다 (Python 3.2).
Wookie88

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. 파이썬 3에서는 그렇게하는 방법이 깔끔하기 때문에 훨씬 더 높게 표시되어야합니다.
Viktor Stískala

2
@ scott654 나는 의견의 시작 부분에 그것을 올바르게 가지고 있다고 생각했지만 충분히 대담하게 덧붙였습니다.
Tim Tisdall

1
코드 블록에서 주석으로 메모를 작성합니다. 왜냐하면 우리는 모두 답변에서 코드를 먼저 스캔하고 코드가 좋아 보인다면 나머지를 읽기 때문입니다. 그래도 좋은 대답입니다.
Matthew Purdon

2
현지 시간이 모호 할 수 있습니다 . 예제 ( datetime.now())는 현지 시간을 나타내는 순진한 datetime 객체의 사용을 권장하고 DST 전환 중에 고유 한 모호성으로 인해 실패 할 수 있으므로 좋지 않습니다. ts = datetime.now(timezone.utc).timestamp()대신 사용할 수 있습니다 .
jfs

@JFSebastian-좋은 지적입니다. 수입품에 추가하고 싶지 않아서로 변경했습니다 utcnow(). 시간대가 UTC로 설정된 컴퓨터에서 작업하는 데 익숙하지만이 코드 스 니펫에서는 가정해서는 안됩니다.
Tim Tisdall

139

이걸 찾았고 더 짧았습니다.

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

12
이것은 질문에 대답하지 않습니다.
Jesse Dhillon

22
@JesseDhillon 제목이 아닌 질문에 대답합니다 (유닉스 타임 스탬프를 5 분 후에 작성하십시오).
dbr

3
time.time()다시 설정할 수 있습니다. 향후 5 분 동안 "만료"값을 작성하려면 time.monotonic()사용 사례에 따라 아날로그 가 필요할 수 있습니다 .
jfs

@ jf-sebastian time.monotonic ()은 UNIX 타임 스탬프를 반환하지 않으며 정의되지 않은 참조 포인트가있는 타임 스탬프를 반환합니다.
rspeer

@rspeer : 예, 문서에서 말했듯 이 연속 호출 간의 차이 만 유효합니다. 사용 가능 여부 monotonic는 사용 사례에 따라 다릅니다. 예를 들어, subprocess모듈은이를 사용하여 timeout옵션 을 구현 합니다.
jfs

57

이것이 당신이 필요로하는 것입니다 :

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

제공되는 'Cat Plus Plus'와 다른 점은 무엇입니까?
David

3
EG 이것은 "Python datetime to Unix timestamp"질문에 대한 답변이며 Cat Plus Plus는 "Python datetime to Unix timestamp to 5 minutes"질문에 대한 답변입니다. 그래서 이것은 깨끗하고 명백합니다.
running.t

@ running.t : "모든 문제에는 간단하고 명백하며 잘못된 해결책이 있습니다." 의 가능한 문제를mktime(dt.timetuple()) 참조하십시오 . datetime.now(timezone.utc).timestamp()@Tim Tisdall에서 제공하는 것은 Python 3.3+의 솔루션입니다. 그렇지 않으면 (dt - epoch).total_seconds()사용할 수 있습니다 .
jfs

@JFSebastian 모든 계산이 현지 시간으로 이루어지기를 원한다면 어떻게해야합니까? 예를 들어 그렇습니까? 현지 시간이 아는 순진한 문자열을 구문 분석하고 해당 특정 시간에 DST가 유효한지 여부를 결정하려면?
n611x007

1
@naxa : 그렇습니다. 일부 현지 시간은 모호하거나 존재하지 않습니다. 또한 표준 시간대 오프셋은 DST 이외의 이유로 다를 수 있습니다 (올바른 오프셋을 찾으려면 pytz와 같은 tz 데이터베이스가 필요합니다). 현지 시간은 현지 정치인이 생각하는 모든 것이 시간 즉, 매우 불규칙적 일 수 있음을 측정하는 좋은 아이디어라고 생각합니다.
jfs

48

형식 문자열을 datetime.strftime사용하여 Epoch 형식으로 시간을 얻는 데 사용할 수 있습니다 %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 ). 리눅스에서 작동하고 win32 (생성 ValueError: Invalid format string) 에서는 작동하지 않는 것 같습니다 .
Antony Hatchkins 2016

3
이 방법은 시간대에서 작동하지 않습니다. 표준 시간대를 변경하면 동일한 결과 날짜 시간 (2013,12,7, tzinfo = timezone ( "America / Chicago"))을 제공합니다. Riga ")). strftime ("% s ") 1386385200
Martins Balodis

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를 안전하게 사용하여 유닉스 시대와의 거리를 계산 한 다음 초 또는 밀리 초로 변환 할 수 있습니다.

결과 유닉스 타임 스탬프 자체는 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 분을 추가하기 위해 (5 * 60)을 추가해서는 안됩니까? 5를 추가하면 타임 스탬프에 5 초만 추가됩니다.
Tim Tisdall

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.