날짜 시간을 유닉스 타임 스탬프로 변환하고 파이썬으로 다시 변환하십시오.
나는 dt = datetime(2013,9,1,11)
이 datetime 객체의 유닉스 타임 스탬프를 얻고 싶습니다.
내가 할 때 나는 (dt - datetime(1970,1,1)).total_seconds()
타임 스탬프를 얻었다 1378033200
.
를 사용하여 다시 변환 할 때 datetime.fromtimestamp
얻었습니다 datetime.datetime(2013, 9, 1, 6, 0)
.
시간이 맞지 않습니다. 내가 여기서 무엇을 놓쳤습니까?
여기서 놓친 것은 시간대입니다.
아마도 UTC 시간이 5 시간이므로 2013-09-01T11 : 00 : 00 로컬과 2013-09-01T06 : 00 : 00Z는 같은 시간입니다.
datetime
시간대와 "순진한"및 "인식"개체에 대해 설명 하는 문서 상단을 읽어야 합니다.
원래 순진 날짜 시간이 UTC 인 경우이를 복구하는 방법은 utcfromtimestamp
대신에 사용하는 것입니다 fromtimestamp
.
반면에 원래 순진한 날짜 시간이 현지 시간 인 경우 UTC 타임 스탬프를 빼지 않아야합니다. 사용하는 datetime.fromtimestamp(0)
대신.
또는 datetime 객체를 알고있는 경우 양쪽에서 로컬 인식 시간을 사용하거나 UTC와 명시 적으로 변환해야합니다.
Python 3.3 이상을 가지고 있거나 업그레이드 할 수 timestamp
있는 경우 직접 수행하는 방법을 알아내는 대신 방법을 사용하여 이러한 모든 문제를 피할 수 있습니다 . 그렇지 않은 경우에도 소스 코드 대여 를 고려할 수 있습니다 .
(그리고 파이썬 3.4를 기다릴 수 있다면 PEP 341 이 최종 릴리스로 만들 것 같습니다. 즉, JF Sebastian과 내가 언급 한 모든 내용은 stdlib로만 가능해야합니다. Unix와 Windows에서 동일한 방식으로 작동합니다.)
해결책은
import time
import datetime
d = datetime.date(2015,1,5)
unixtime = time.mktime(d.timetuple())
오히려이 표현보다 POSIX 타임 스탬프를에서 만들 수 있습니다 dt
,
(dt - datetime(1970,1,1)).total_seconds()
이것을 사용하십시오 :
int(dt.strftime("%s"))
두 번째 방법을 사용하여 귀하의 예에서 정답을 얻습니다.
편집 : 일부 후속 조치 ... 일부 의견 (아래 참조) 후에에 대한 지원이나 문서가 부족한 것에 대해 궁금 %s
했습니다 strftime
. 내가 찾은 것은 다음과 같습니다.
에서 파이썬 소스 에 대한 datetime
과 time
, 문자열이 STRFTIME_FORMAT_CODES
우리에게 알려줍니다 :
"Other codes may be available on your platform.
See documentation for the C library strftime function."
이제 우리 man strftime
(Mac OS X와 같은 BSD 시스템)에서 다음을 지원합니다 %s
.
"%s is replaced by the number of seconds since the Epoch, UTC (see mktime(3))."
어쨌든 %s
그것이 시스템에서 작동하는 이유 입니다. 그러나 표준 시간대를 고려한 OP 문제에 대한 더 나은 솔루션이 있습니다. 여기 @abarnert의 허용 답변을 참조하십시오.
에포크 이후로 파이썬 날짜 시간을 초로 변환하려면 명시 적으로 수행해야합니다.
>>> import datetime
>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0
Python 3.3 이상에서는 timestamp()
대신 사용할 수 있습니다 .
>>> import datetime
>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0
시간대 정보를 놓쳤습니다 (이미 답변, 동의 함)
arrow
패키지 는 datetimes와 함께이 고문을 피할 수 있습니다; 이미 작성, 테스트, pypi-published, cross-python (2.6 — 3.xx)입니다.
필요한 것 : pip install arrow
(또는 의존성에 추가)
귀하의 경우를위한 솔루션
dt = datetime(2013,9,1,11)
arrow.get(dt).timestamp
# >>> 1378033200
bc = arrow.get(1378033200).datetime
print(bc)
# >>> datetime.datetime(2013, 9, 1, 11, 0, tzinfo=tzutc())
print(bc.isoformat())
# >>> '2013-09-01T11:00:00+00:00'
If your datetime object represents UTC time, don't use time.mktime, as it assumes the tuple is in your local timezone. Instead, use calendar.timegm:
>>> import datetime, calendar
>>> d = datetime.datetime(1970, 1, 1, 0, 1, 0)
>>> calendar.timegm(d.timetuple())
60
For working with UTC timezones:
time_stamp = calendar.timegm(dt.timetuple())
datetime.utcfromtimestamp(time_stamp)
Well, when converting TO unix timestamp, python is basically assuming UTC, but while converting back it will give you a date converted to your local timezone.
See this question/answer; Get timezone used by datetime.datetime.fromtimestamp()
def dt2ts(dt, utc=False):
if utc:
return calendar.timegm(dt.timetuple())
if dt.tzinfo is None:
return int(time.mktime(dt.timetuple()))
utc_dt = dt.astimezone(tz.tzutc()).timetuple()
return calendar.timegm(utc_dt)
If you want UTC timestamp :time.mktime
just for local dt .Use calendar.timegm
is safe but dt must the utc zone so change the zone to utc. If dt in UTC just use calendar.timegm
.
def datetime_to_epoch(d1):
# create 1,1,1970 in same timezone as d1
d2 = datetime(1970, 1, 1, tzinfo=d1.tzinfo)
time_delta = d1 - d2
ts = int(time_delta.total_seconds())
return ts
def epoch_to_datetime_string(ts, tz_name="UTC"):
x_timezone = timezone(tz_name)
d1 = datetime.fromtimestamp(ts, x_timezone)
x = d1.strftime("%d %B %Y %H:%M:%S")
return x
'Programing' 카테고리의 다른 글
라텍스로 URL을 작성하는 방법? (0) | 2020.06.05 |
---|---|
1-10 Java 사이의 난수 생성 (0) | 2020.06.05 |
0으로 끝나지 않고 파이썬에서 부동 형식화 (0) | 2020.06.05 |
Python Django에서 단위 테스트를 실행하는 동안 로깅을 비활성화하려면 어떻게합니까? (0) | 2020.06.05 |
Python 문서에 javadoc 사용하기 (0) | 2020.06.05 |