datetime을 Unix 타임 스탬프로 변환하고 파이썬으로 다시 변환하십시오.


186

나는 dt = datetime(2013,9,1,11)이 datetime 객체의 유닉스 타임 스탬프를 얻고 싶습니다.

내가 할 때 나는 (dt - datetime(1970,1,1)).total_seconds()타임 스탬프를 얻었다 1378033200.

를 사용하여 다시 변환 할 때 datetime.fromtimestamp얻었습니다 datetime.datetime(2013, 9, 1, 6, 0).

시간이 맞지 않습니다. 내가 여기서 무엇을 놓쳤습니까?



1
참고로 Python 3.3 이상을 사용하는 경우 실제로 timestamp직접 시도하는 대신 메소드 를 사용 하려고합니다. 우선, 다른 시간대에서 순진 시간을 빼는 가능성을 완전히 피할 수 있습니다.
abarnert

1
어디 dt에서 왔습니까? UTC로 현지 시간입니까?
jfs

2
@abarnert 또한 모든 코드 페이지와 유니 코드 기호를 제거하라는 요청을 제출하고 싶습니다. 즉, 모든 비 ASCII 및 기본이 아닌 코드 페이지 언어를 금지합니다. 기호 그림은 여전히 ​​허용됩니다.
Daniel F

6
@DanielF : 요청이 거부되었습니다. 나는 여기서 단일 세계 언어를 만드는 데 관심이 없으며, 비록 우리가 그렇게해도 역사 학자와 톨킨 학자들에게는 삶을 불가능하게 만들고 싶지 않습니다. 유니 코드는 특정 조직 및 제품 (TRON 컨소시엄, UTF-8에서 Shift-JIS를 사용하는 일본어 소프트웨어, Microsoft는 여전히 사용자 텍스트 파일의 경우 기본적으로 cp1252 인 OS 및 UTF를 가장하는 다양한 SDK를 제공함)을 제외하고 문제를 해결합니다. -16은 고정 너비 문자 세트이며 유니 코드와 동일합니다.) 문자를 맞추려면 처벌을 받아야합니다.
abarnert

답변:


105

여기서 놓친 것은 시간대입니다.

아마도 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에서 동일한 방식으로 작동합니다.)


1
dt현지 시간대 인 경우 질문의 수식이 잘못되었습니다 datetime.fromtimestamp(0)(현재 시간대의 datetime(1970, 1,1)에포크) (UTC의 유닉스 에포크) 대신 사용해야합니다 .
jfs

@ JFSebastian : 세 가지 가능성을 모두 자세히 다루고 싶지는 않지만 맞습니다.
abarnert

btw, fromtimestamp(0)시스템이 과거 시간대 정보를 Windows에 저장하지 않으면 실패 할 수 있습니다. pytz이 경우에 사용될 수 있습니다.
jfs

@JFSebastian : 그러나 pytz현재 시간대를 알지 못한다면 도움이되지 않습니다. 프로그래밍 방식으로 수행하려면 현재 Windows 표준 시간대를 가져 와서 표준 시간대로 변환 pytz하거나 이름으로 찾는 다른 라이브러리가 필요합니다 .
abarnert

tzlocal또한 Windows에서 작동하는 모듈. utc 시간을 현지 시간으로 변환 하는 방법은 다음과 같습니다 .
jfs

141

해결책은

import time
import datetime
d = datetime.date(2015,1,5)

unixtime = time.mktime(d.timetuple())

12
d로컬 시간을 나타내는 순진한 날짜 / 날짜 / 시간 객체 라고 가정합니다 (OS가 과거 tz db를 제공하지 않으면 모호한 시간 또는 과거 / 미래 날짜에 대해 실패 할 수 있음 (UTC 오프셋이 로컬에서 과거에 다를 수 있음) 시간대)). 더 많은 옵션 .
jfs

6
아무도 부동 소수점 솔루션을 생각하지 않는 것 같습니다. 모두에게 분명한가?
Ivan Balashov 2016 년

4
이것은 마이크로 초를 떨어 뜨립니다. 흥미로울 수 있습니다.
Alfe

문제는 시간대를 고려하지 않는다는 것입니다.
Blairg23

해서는 안됩니다. TZ를 조정해야하는 경우 먼저 조정해야합니다.
Marcin Orlowski

69

에포크 이후로 파이썬 날짜 시간을 초로 변환하려면 명시 적으로 수행해야합니다.

>>> 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

5
시간대를 고려하지 않습니다.
Blairg23

3
%s현재 사용중인 시스템의 시계로 현지화되므로을 ( 를) 사용하고 싶지 않습니다 . .timestamp()올바른 Epoch / UNIX 시간을 얻는 데만 사용해야 합니다.
Blairg23

3
%sWindows 시스템에서 작동하지 않음 ( ValueError: Invalid format string)
chrki

1
@ amitnair92 그냥 넣어 8또는9
Francisco Costa

54

오히려이 표현보다 POSIX 타임 스탬프를에서 만들 수 있습니다 dt,

(dt - datetime(1970,1,1)).total_seconds()

이것을 사용하십시오 :

int(dt.strftime("%s"))

두 번째 방법을 사용하여 귀하의 예에서 정답을 얻습니다.

편집 : 일부 후속 조치 ... 일부 의견 (아래 참조) 후에에 대한 지원이나 문서가 부족한 것에 대해 궁금 %s했습니다 strftime. 내가 찾은 것은 다음과 같습니다.

에서 파이썬 소스 에 대한 datetimetime, 문자열이 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의 허용 답변을 참조하십시오.


4
이것은 문서화되지 않은 행동입니다 (믿습니다). 예를 들어 창에서는 "잘못된 형식 문자열"이됩니다.
초승달 신선한

@CrescentFresh, 재미있는. 당신이 옳을 수도 있습니다. strftime("%s")문서 에는 보이지 않지만 Mac 및 Linux에서 작동하는지 확인했습니다. 감사.
Darren Stone

1
분명히 tzinfo 필드를 무시합니다.
Daniel F

1
@DarrenStone : 소스를 읽을 필요가 없습니다. 모두 time.strftime()datetime.strftime플랫폼에 문서 대표는 strftime(3)지원되지 않는 지시를 위해 작동합니다. %sMac OS X에서도 실패 할 수 있습니다. 예를 들어 datetime.strftime ( '% s')는 tzinfo를 존중해야합니다 .
jfs

1
%s사용중인 시스템의 현지화 된 시스템 시간 만 사용하므로 절대 사용해서는 안됩니다 . .timestamp()실제 UNIX 타임 스탬프를 얻으려는 경우 사용 하려고합니다.
Blairg23

6

UTC 시간대로 작업하는 경우 :

time_stamp = calendar.timegm(dt.timetuple())

datetime.utcfromtimestamp(time_stamp)

한 시간의 검색 후, 이것이 효과가있는 유일한 대답이었습니다. ')
Qurashi

4

시간대 정보를 놓쳤습니다 (이미 답변, 동의 함)

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'

3

datetime 객체가 UTC 시간을 나타내는 경우 튜플이 현지 시간대에 있다고 가정하므로 time.mktime을 사용하지 마십시오. 대신 calendar.timegm을 사용하십시오.

>>> import datetime, calendar
>>> d = datetime.datetime(1970, 1, 1, 0, 1, 0)
>>> calendar.timegm(d.timetuple())
60


1
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)

당신은 UTC 타임 스탬프를 원하는 경우 time.mktime단지에 대한 지역 DT .Use은 calendar.timegm안전하지만, DT는 UTC 영역은 너무 UTC로 영역을 변경해야합니다. UTC의 dt 인 경우을 사용하십시오 calendar.timegm.


1
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

0

이 클래스는 사용자의 요구를 충족 시키며, 변수를 ConvertUnixToDatetime에 전달하고 원하는 기능을 호출하여 기반으로 할 수 있습니다.

from datetime import datetime
import time

class ConvertUnixToDatetime:
    def __init__(self, date):
        self.date = date

    # Convert unix to date object
    def convert_unix(self):
        unix = self.date

        # Check if unix is a string or int & proceeds with correct conversion
        if type(unix).__name__ == 'str':
            unix = int(unix[0:10])
        else:
            unix = int(str(unix)[0:10])

        date = datetime.utcfromtimestamp(unix).strftime('%Y-%m-%d %H:%M:%S')

        return date

    # Convert date to unix object
    def convert_date(self):
        date = self.date

        # Check if datetime object or raise ValueError
        if type(date).__name__ == 'datetime':
            unixtime = int(time.mktime(date.timetuple()))
        else:
            raise ValueError('You are trying to pass a None Datetime object')
        return type(unixtime).__name__, unixtime


if __name__ == '__main__':

    # Test Date
    date_test = ConvertUnixToDatetime(datetime.today())
    date_test = date_test.convert_date()
    print(date_test)

    # Test Unix
    unix_test = ConvertUnixToDatetime(date_test[1])
    print(unix_test.convert_unix())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.