파이썬에서 날짜 시간 객체를 에포크 (유닉스 시간) 이후 밀리 초로 어떻게 변환 할 수 있습니까?


답변:


471

이 작업을 수행하는 가장 간단한 방법은

import datetime

epoch = datetime.datetime.utcfromtimestamp(0)

def unix_time_millis(dt):
    return (dt - epoch).total_seconds() * 1000.0

32
지금까지 이것이 최상의 솔루션입니다 (파이썬 버전이 2.7 이상인 경우). 의 구현 %s은 OS에 의존 하기 때문에 ! 따라서 누구나 어떤 OS를 사용하든 코드를 안정적으로 작동하기를 원합니다 %s. 2.3 <py ver <2.7의 경우. 다음 total_seconds()과 같이 간단하게 만들 수 있습니다 .delta.days*86400+delta.seconds+delta.microseconds/1e6
Wang

14
참고 : dtUTC가 아니어야합니다 (로컬이 아님). Python 2.6 / 3 지원으로 비슷한 답변
jfs

7
en.wikipedia.org/wiki/Unix_time에 정의 된대로 진정한 유닉스 타임 스탬프 인 경우 (이 답변에서 unix_time 함수 만 사용 함) delta.total_seconds ()를 int로 래핑해야합니다. float로 끝나는 것을 피하십시오
corford

1
에포크를 사용하여 계산 된 에포크 utcfromtimestamp(0)는 'tz'가 0이 아닌 경우에만 'tz'오프셋을 유발할 수 있습니다 . 에포크가 UTC 시간 인 경우 'tz'가 계산 되었기 때문 dt 입니다 dt- epoch. 에포크를 계산하는 가장 좋은 방법은 epoch = datetime.datetime(1970, 1, 1)시간대를 고려하는 것입니다.
ahj

35
datetime.utcfromtimestamp(0)tzinfo없이 날짜 시간을 반환합니까? 메소드 이름 utc fromtimestamp에 바로 있습니다. 순진하지 않게하려면 다음과 같은 작업을 수행해야합니다 datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC). 경우에 필요하다 dt시간대를 인식하거나 다른 당신이 얻을 것이다TypeError: can't subtract offset-naive and offset-aware datetimes
FGreg

168

Python 3.3에서 새로운 메소드가 추가되었습니다 timestamp.

import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()

귀하의 질문에 밀리 초가 필요하다고 말했으며 다음과 같이 얻을 수 있습니다.

milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000

timestamp순진한 datetime 객체 를 사용 하는 경우 로컬 시간대에 있다고 가정합니다. 의도하지 않은 시간대 인식 날짜 / 시간 개체를 사용하십시오.


28
참고 :이 .timestamp()방법은 순진한 입력 날짜 시간이 현지 시간대에 있다고 가정합니다 (현지 시간이 모호 할 수 있음). UTC 인 경우 dt.replace(tzinfo=timezone.utc).timestamp()대신 사용하십시오 .
jfs

11
datetime.timestamp ()는 에포크 초를 부동 소수점으로 리턴합니다. 밀리 초를 얻으려면 : int (datetime.timestamp () * 1000)
Solar.gy

9
이 답변은 docs.python.org/3/library/에있는 인간 친화적이지 않은 문서의 정신에 따라 복사하여 붙여 넣을 수 있는 예가 아닙니다.datetime.datetime.timestamp(datetime.datetime.now())
이것은

3
3.6 (적어도)에서 datetime.timestamp ()는 표준 시간대 (tzinfo = None) 날짜 시간이 UTC로 가정합니다. 따라서 항상 시간대를 설정하는 것이 좋습니다 : datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()(항상) 같지 않음 ( datetime.datetime.now().timestamp()로컬 tz가 UTC 인 경우이 마지막 것만 나머지와 같습니다 ...)
Bluu

1
당신의 관심을 위해 그 반대는] fromtimestamp( docs.python.org/3/library/… )
Flimm

98
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000 
1312908481000

또는 시간 모듈의 도움으로 날짜 형식이 없습니다.

>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0

http://pleac.sourceforge.net/pleac_python/datesandtimes.html의 도움으로 답변

선적 서류 비치:


6
Btw, strftime ( "% s")는 빈 문자열을 반환합니다. 두 번째 방법은 잘 작동합니다.
Pavel Vlasov

23
두 번째 정확도 만
shuckc

6
'% s'은 (는) Python에서 지원하지 않습니다. 예를 들어 Windows에는 없을 수 있습니다. .timetuple()반환 tm_isdst=-1이 힘은 mktime()생각합니다. DST 중에 잘못 추측 할 수 있습니다 (50 %의 확률 +/- 시간). '% s'둘 다 mktime()과거의 날짜에 대해 잘못된 utc 오프셋을 사용할 수 있습니다. pytz로컬 시간을 POSIX 타임 스탬프로 안정적으로 변환하려면 모듈에서 제공 한 과거 시간대 DB가 필요합니다 (OS가 이미 그러한 DB를 제공하지 않는 한)
jfs

1
time.mktime(ts.timetuple())여기서 ts는 파이썬의 datetime 객체입니다
suhailvs

1
@ suhail :에 대한 내 의견을 읽으십시오 mktime/timetuple. 또한 timetuple()1 초의 분수를 제거하고 문제의 요점은 밀리 초 정밀도로 타임 스탬프를 얻는 것입니다.
jfs


13

이것이 내가하는 방법입니다.

from datetime import datetime
from time import mktime

dt = datetime.now()
sec_since_epoch = mktime(dt.timetuple()) + dt.microsecond/1000000.0

millis_since_epoch = sec_since_epoch * 1000


2
@JFSebastian 감사합니다! 실제로 고려할 dst는 없습니다. 서버가 UTC가 아닌 현지 시간에 있으면 차이가 있습니다. UTC 이외의 다른 서버로 서버를 설정해야 할 강력한 이유를 찾지 못했습니다. 내 모토는 "UTC 작성, 현지 시간 읽기"이므로 언제 어디에서 머무르는 지 알 수 있습니다.
estani

2
시간대를 추측하려는 mktime의 문제를 피하기 위해 mktime 대신 calendar.timegm을 사용할 수 있습니다.
Decko

13

@ChristopherBull 밀리 초를 1000으로 나누면 몇 초가됩니다.
Jonas

5
당신은 오해하고 잘못된 길을 찾았습니다. 위 기능에서 초를 모두 사용할 수 있습니다. 밀리 초로 변환 할 수 있지만 1 초의 정밀도가됩니다.
Christopher Bull

1
이 답변은 time모듈을 사용 하지만 OP는 datetime모듈 에 대해 물었습니다 . FWIW, 가장 간단한 현재 시대는int(time.time())
MarkHu

7
from datetime import datetime
from calendar import timegm

# Note: if you pass in a naive dttm object it's assumed to already be in UTC
def unix_time(dttm=None):
    if dttm is None:
       dttm = datetime.utcnow()

    return timegm(dttm.utctimetuple())

print "Unix time now: %d" % unix_time()
print "Unix timestamp from an existing dttm: %d" % unix_time(datetime(2014, 12, 30, 12, 0))

timegm()utc 시간에만 작동합니다. 사용하지 않으므로 대신 tm_isdst사용할 수 있습니다 . 참고 : 사용 이 잘못되었습니다. 현지 시간을 utc로 변환하지 않습니다. 또한 호출은 결과에서 1 초의 분수를 제거합니다 (문제는 응용 프로그램에 따라 다름). 또한 질문은 초가 아닌 * milli * 초에 대해 묻습니다utcnow.timetuple()utcnow.utctimetuple()naive_local_datetime.utctimetuple()timetuple()
jfs

utcnow () 및 utctimetuple ()을 사용하여 UTC를 다루고 있음을 코드에 명확하게 알리는 것을 선호합니다 (그리고이를 읽는 사람은 timegm이 UTC 만임을 기억할 필요가 없습니다). utctimetuple ()은 순진한 dttm 객체에 대한 번역을 의미하지 않습니다 (따라서 utcnow ()로 dttm을 초기화 함). 또한 질문은 초 또는 밀리 초를 언급했습니다.
corford

참고 : 마지막 의견에서 그가 몇 초 또는 밀리 초 (아마도 내 실수)를 원한다는 것을 암시하면서 질문을 읽었습니다. Millis의 경우 최고 점수 답변에서 알 수 있듯이 1000을 곱하면됩니다.
corford

utctimetuple()초의 분수를 제거합니다. 곱하면 1000다시 돌려받지 못합니다.
jfs

1
OP가이 질문을 한 방식 때문에, 그가 원하는 것을 정확히 알 수 없습니다 (예 : 진정한 유닉스 타임 스탬프 또는 밀리 초 정확도의 타임 스탬프). 어쨌든, 두 질문 모두 이미 다른 곳에서 요청되고 답변되었습니다. 내가 말했듯이, 여기에있는 답변은 사람들이 문제에 대한 다양한 솔루션을 설명하는 데 가장 빠르고 깨끗하다고 ​​생각합니다.
corford

3
>>> import datetime
>>> import time
>>> import calendar

>>> #your datetime object
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 3, 19, 13, 0, 9, 351812)

>>> #use datetime module's timetuple method to get a `time.struct_time` object.[1]
>>> tt = datetime.datetime.timetuple(now)
>>> tt
time.struct_time(tm_year=2013, tm_mon=3, tm_mday=19, tm_hour=13, tm_min=0, tm_sec=9,     tm_wday=1, tm_yday=78, tm_isdst=-1)

>>> #If your datetime object is in utc you do this way. [2](see the first table on docs)
>>> sec_epoch_utc = calendar.timegm(tt) * 1000
>>> sec_epoch_utc
1363698009

>>> #If your datetime object is in local timeformat you do this way
>>> sec_epoch_loc = time.mktime(tt) * 1000
>>> sec_epoch_loc
1363678209.0

[1] http://docs.python.org/2/library/datetime.html#datetime.date.timetuple

[2] http://docs.python.org/2/library/time.html


3

시간 객체를 정규화하는 또 다른 형태의 솔루션이 있습니다.

def to_unix_time(timestamp):
    epoch = datetime.datetime.utcfromtimestamp(0) # start of epoch time
    my_time = datetime.datetime.strptime(timestamp, "%Y/%m/%d %H:%M:%S.%f") # plugin your time object
    delta = my_time - epoch
    return delta.total_seconds() * 1000.0

2

약간의 팬더 코드 :

import pandas

def to_millis(dt):
    return int(pandas.to_datetime(dt).value / 1000000)

1
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000

9
이것은 잘못이다! 타임 튜플에는 밀리 초가 포함되지 않으므로 mktime은 밀리 초 해상도로 에포크를 반환하지 않습니다. 이 경우에는 쓸모가 없습니다.
Wang

@ 왕-당신은 정확합니다, 이것은 밀리 초, 단 몇 초를 반환하지 않습니다
MattoTodd


1
그래도 제거 * 1000하면 얻을 수 seconds_since_epoch있습니다. 지금은 밀리 초를 신경 쓰지 않기 때문에이 대답을지지합니다.
Michael Scheper

0

위의 답변을 기반으로 만든 기능은 다음과 같습니다.

def getDateToEpoch(myDateTime):
    res = (datetime.datetime(myDateTime.year,myDateTime.month,myDateTime.day,myDateTime.hour,myDateTime.minute,myDateTime.second) - datetime.datetime(1970,1,1)).total_seconds()
    return res

반환 된 값을 다음과 같이 줄 바꿈 할 수 있습니다. str (int (res)) 10 진수 값없이 문자열로 사용하거나 int (str없이) 반환하려면


-14

unixtimestampmillis에 대한 비밀 날짜 시간에 대한 다른 솔루션입니다.

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    public static long GetCurrentUnixTimestampMillis()
    {
        DateTime localDateTime, univDateTime;
        localDateTime = DateTime.Now;          
        univDateTime = localDateTime.ToUniversalTime();
        return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
    } 

2
파이썬 언어에 관한 질문
Stéphane
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.