답변:
이 작업을 수행하는 가장 간단한 방법은
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
은 OS에 의존 하기 때문에 ! 따라서 누구나 어떤 OS를 사용하든 코드를 안정적으로 작동하기를 원합니다 %s
. 2.3 <py ver <2.7의 경우. 다음 total_seconds()
과 같이 간단하게 만들 수 있습니다 .delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
UTC가 아니어야합니다 (로컬이 아님). Python 2.6 / 3 지원으로 비슷한 답변
utcfromtimestamp(0)
는 'tz'가 0이 아닌 경우에만 'tz'오프셋을 유발할 수 있습니다 . 에포크가 UTC 시간 인 경우 'tz'가 계산 되었기 때문 dt
입니다 dt- epoch
. 에포크를 계산하는 가장 좋은 방법은 epoch = datetime.datetime(1970, 1, 1)
시간대를 고려하는 것입니다.
datetime.utcfromtimestamp(0)
tzinfo없이 날짜 시간을 반환합니까? 메소드 이름 utc fromtimestamp에 바로 있습니다. 순진하지 않게하려면 다음과 같은 작업을 수행해야합니다 datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
. 경우에 필요하다 dt
시간대를 인식하거나 다른 당신이 얻을 것이다TypeError: can't subtract offset-naive and offset-aware datetimes
Python 3.3에서 새로운 메소드가 추가되었습니다 timestamp
.
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
귀하의 질문에 밀리 초가 필요하다고 말했으며 다음과 같이 얻을 수 있습니다.
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
timestamp
순진한 datetime 객체 를 사용 하는 경우 로컬 시간대에 있다고 가정합니다. 의도하지 않은 시간대 인식 날짜 / 시간 개체를 사용하십시오.
.timestamp()
방법은 순진한 입력 날짜 시간이 현지 시간대에 있다고 가정합니다 (현지 시간이 모호 할 수 있음). UTC 인 경우 dt.replace(tzinfo=timezone.utc).timestamp()
대신 사용하십시오 .
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
(항상) 같지 않음 ( datetime.datetime.now().timestamp()
로컬 tz가 UTC 인 경우이 마지막 것만 나머지와 같습니다 ...)
fromtimestamp
( docs.python.org/3/library/… )
>>> 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의 도움으로 답변
선적 서류 비치:
.timetuple()
반환 tm_isdst=-1
이 힘은 mktime()
생각합니다. DST 중에 잘못 추측 할 수 있습니다 (50 %의 확률 +/- 시간). '% s'둘 다 mktime()
과거의 날짜에 대해 잘못된 utc 오프셋을 사용할 수 있습니다. pytz
로컬 시간을 POSIX 타임 스탬프로 안정적으로 변환하려면 모듈에서 제공 한 과거 시간대 DB가 필요합니다 (OS가 이미 그러한 DB를 제공하지 않는 한)
time.mktime(ts.timetuple())
여기서 ts는 파이썬의 datetime 객체입니다
mktime/timetuple
. 또한 timetuple()
1 초의 분수를 제거하고 문제의 요점은 밀리 초 정밀도로 타임 스탬프를 얻는 것입니다.
Delorean을 사용하여 시간과 공간을 여행 할 수 있습니다!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
이것이 내가하는 방법입니다.
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
모듈에 대한 Python 2.7 문서의 권장 사항time
time
모듈을 사용 하지만 OP는 datetime
모듈 에 대해 물었습니다 . FWIW, 가장 간단한 현재 시대는int(time.time())
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()
utctimetuple()
초의 분수를 제거합니다. 곱하면 1000
다시 돌려받지 못합니다.
>>> 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
시간 객체를 정규화하는 또 다른 형태의 솔루션이 있습니다.
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
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000
* 1000
하면 얻을 수 seconds_since_epoch
있습니다. 지금은 밀리 초를 신경 쓰지 않기 때문에이 대답을지지합니다.
위의 답변을 기반으로 만든 기능은 다음과 같습니다.
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없이) 반환하려면
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;
}