programing

Python에서 datetime.date를 UTC 타임스탬프로 변환하는 중

goodsources 2022. 10. 30. 11:15
반응형

Python에서 datetime.date를 UTC 타임스탬프로 변환하는 중

Python에서 날짜를 다루고 있는데 Javascript에서 사용하기 위해 UTC 타임스탬프로 변환해야 합니다.다음 코드가 작동하지 않습니다.

>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)

먼저 날짜 개체를 날짜/시간으로 변환하는 것도 도움이 되지 않습니다.링크에서 이 예를 사용해 보았습니다만,

from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)

다음 중 하나를 선택합니다.

mktime(utc.localize(input_date).utctimetuple())

또는

mktime(timezone('US/Eastern').localize(input_date).utctimetuple())

동작합니다.

일반적인 질문입니다.UTC에 따라 에폭 이후의 날짜를 초로 변환하려면 어떻게 해야 합니까?

ifd = date(2011, 1, 1)UTC:

>>> from datetime import datetime, date
>>> import calendar
>>> timestamp1 = calendar.timegm(d.timetuple())
>>> datetime.utcfromtimestamp(timestamp1)
datetime.datetime(2011, 1, 1, 0, 0)

ifd로컬 타임존에 있습니다.

>>> import time
>>> timestamp2 = time.mktime(d.timetuple()) # DO NOT USE IT WITH UTC DATE
>>> datetime.fromtimestamp(timestamp2)
datetime.datetime(2011, 1, 1, 0, 0)

timestamp1 ★★★★★★★★★★★★★★★★★」timestamp2로컬 타임존의 자정이 UTC의 자정과 같은 시간 인스턴스가 아닌 경우,는 다를 수 있습니다.

mktime()에 의해 잘못된 결과가 될 수 .d애매한 현지시간(예를 들어 DST 이행 중)에 대응하거나dutc 오프셋이 다를 수 있는 과거(미래) 날짜 및 C입니다.mktime()는 지정된 플랫폼의 tz 데이터베이스에 액세스할 수 없습니다.모듈(예를 들어 경유)사용하여 모든 플랫폼의 tz 데이터베이스에 액세스할있습니다., 타임 존이 사용되고 있는 경우는, 에러가 발생해, POSIX 이외의 타임스탬프가 반환되는 일이 있습니다.


datetime.date(UTC)를 사용하지 않고 UTC로 calendar.timegm():

DAY = 24*60*60 # POSIX day in seconds (exact value)
timestamp = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * DAY
timestamp = (utc_date - date(1970, 1, 1)).days * DAY

UTC에 따라 에폭 이후의 날짜를 초로 변환하려면 어떻게 해야 합니까?

datetime.datetime)datetime.date하는 타임스탬프에 UTC POSIX' (a) 'UTC')float를 참조해 주세요.

Python 3.3+

다음과 같습니다datetime.timestamp().

from datetime import timezone

timestamp = dt.replace(tzinfo=timezone.utc).timestamp()

주의: 제공이 필요합니다.timezone.utc으로 그렇지 않은 경우.timestamp()연월일하다

Python 3 (< 3.3)

의 문서:

datetime 인스턴스로부터 타임스탬프를 취득하는 방법은 없지만 datetime 인스턴스 dt에 대응하는 POSIX 타임스탬프는 다음과 같이 쉽게 계산할 수 있습니다.순진한 dt의 경우:

timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

또한 인식 dt의 경우:

timestamp = (dt - datetime(1970,1,1, tzinfo=timezone.utc)) / timedelta(seconds=1)

재미있는 읽을거리:에폭 시간 하루시간 차이는? 초가 지났습니까?

참고 항목: datetime에는 "Epoch" 메서드가 필요합니다.

파이썬 2

위의 코드를 Python 2용으로 수정하려면:

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

여기서 는 에 상당합니다.(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6진정한 분열

from __future__ import division
from datetime import datetime, timedelta

def totimestamp(dt, epoch=datetime(1970,1,1)):
    td = dt - epoch
    # return td.total_seconds()
    return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6 

now = datetime.utcnow()
print now
print totimestamp(now)

부동 소수점 문제에 주의하십시오.

산출량

2012-01-08 15:34:10.022403
1326036850.02

변환 datetime 투 POSIX

assert dt.tzinfo is not None and dt.utcoffset() is not None
timestamp = dt.timestamp() # Python 3.3+

Python 3의 경우:

from datetime import datetime, timedelta, timezone

epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
timestamp = (dt - epoch) / timedelta(seconds=1)
integer_timestamp = (dt - epoch) // timedelta(seconds=1)

Python 2의 경우:

# utc time = local time              - utc offset
utc_naive  = dt.replace(tzinfo=None) - dt.utcoffset()
timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()

UNIX 시스템의 경우:

>>> import datetime
>>> d = datetime.date(2011, 1, 1)
>>> d.strftime("%s")  # <-- THIS IS THE CODE YOU WANT
'1293832800'

1: 이는 현지화된 시간대를 적용하는 으로 관찰되었습니다.생산에 사용하지 마십시오.

2: Jakub Narbski는 오프셋 인식 datetime(Python 2.7에서 테스트 완료)에서도 타임존 정보가 무시된다고 지적했습니다.

  • 전제 조건 1: 날짜를 타임스탬프로 변환하려고 하지만 날짜가 24시간 기간을 포함하므로 해당 날짜를 나타내는 타임스탬프는 한 개도 없습니다.당신은 그 날짜의 타임스탬프를 자정(00:00:00.000)에 나타내고 싶다고 생각합니다.

  • 전제 조건 2: 지정한 날짜가 특정 시간대와 관련되어 있지 않지만 특정 시간대(UTC)로부터의 오프셋을 결정하려고 합니다.날짜가 속한 시간대를 모르면 특정 시간대의 타임스탬프를 계산할 수 없습니다.당신은 날짜를 로컬 시스템 표준 시간대로 취급하고 싶다고 생각합니다.

날짜 를 다양한 할 수 .timetuple()★★★★

dtt = d.timetuple() # time.struct_time(tm_year=2011, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=-1)

다음 그것을 할 수 .time.mktime:

ts = time.mktime(dtt) # 1293868800.0

이 방법을 확인하려면 에폭 시간 자체(1970-01-01)를 사용하여 테스트합니다.이 경우 함수는 해당 날짜에 로컬타임존의 타임존 오프셋을 반환해야 합니다.

d = datetime.date(1970,1,1)
dtt = d.timetuple() # time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=-1)
ts = time.mktime(dtt) # 28800.0

28800.08시간으로 태평양 표준시(지금 내가 있는 곳)에 맞겠지.

나는 나 자신의 두 가지 기능을 정의했다.

  • utc_time2datetime(time_time, tz=없음)
  • datetime2datetime_time(datetime)

여기:

import time
import datetime
from pytz import timezone
import calendar
import pytz


def utc_time2datetime(utc_time, tz=None):
    # convert utc time to utc datetime
    utc_datetime = datetime.datetime.fromtimestamp(utc_time)

    # add time zone to utc datetime
    if tz is None:
        tz_datetime = utc_datetime.astimezone(timezone('utc'))
    else:
        tz_datetime = utc_datetime.astimezone(tz)

    return tz_datetime


def datetime2utc_time(datetime):
    # add utc time zone if no time zone is set
    if datetime.tzinfo is None:
        datetime = datetime.replace(tzinfo=timezone('utc'))

    # convert to utc time zone from whatever time zone the datetime is set to
    utc_datetime = datetime.astimezone(timezone('utc')).replace(tzinfo=None)

    # create a time tuple from datetime
    utc_timetuple = utc_datetime.timetuple()

    # create a time element from the tuple an add microseconds
    utc_time = calendar.timegm(utc_timetuple) + datetime.microsecond / 1E6

    return utc_time

python2.7 문서에 따라 time.time이 아닌 calendar.timegm()을 사용해야 합니다.

>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(calendar.timegm(d.timetuple()))
datetime.datetime(2011, 1, 1, 0, 0)

완전한 시간 문자열에는 다음이 포함됩니다.

  • 날짜.
  • 시간을
  • utcoffset(오프셋)

예를 들어 다음과 같습니다.

1970-01-01 06:00:00 +0500 == 1970-01-01 01:00:00 +0000 == UNIX timestamp:3600

$ python3
>>> from datetime import datetime
>>> from calendar import timegm
>>> tm = '1970-01-01 06:00:00 +0500'
>>> fmt = '%Y-%m-%d %H:%M:%S %z'
>>> timegm(datetime.strptime(tm, fmt).utctimetuple())
3600

주의:

UNIX timestamp 는, 에폭 이후의 부동 소수점 번호(UTC)입니다.


편집:

$ python3
>>> from datetime import datetime, timezone, timedelta
>>> from calendar import timegm
>>> dt = datetime(1970, 1, 1, 6, 0)
>>> tz = timezone(timedelta(hours=5))
>>> timegm(dt.replace(tzinfo=tz).utctimetuple())
3600

화살표 패키지 사용:

>>> import arrow
>>> arrow.get(2010, 12, 31).timestamp
1293753600
>>> time.gmtime(1293753600)
time.struct_time(tm_year=2010, tm_mon=12, tm_mday=31, 
    tm_hour=0, tm_min=0, tm_sec=0, 
    tm_wday=4, tm_yday=365, tm_isdst=0)

질문이 좀 헷갈리네요.타임스탬프는 UTC가 아니라 Unix의 것입니다.날짜는 UTC일 수 있습니다.Python 3.2+를 사용하는 경우 simple-date를 사용하면 다음과 같습니다.

>>> SimpleDate(date(2011,1,1), tz='utc').timestamp
1293840000.0

'연월일'을 됩니다.date:

>>> SimpleDate(2011,1,1, tz='utc').timestamp
1293840000.0

날짜가 다른 표준 시간대에 있는 경우(관련된 시간이 없는 자정을 가정하기 때문에 이 문제는 중요합니다)

>>> SimpleDate(date(2011,1,1), tz='America/New_York').timestamp
1293858000.0

[Simple-date 뒤에 있는 아이디어는 모든 Python의 날짜 및 시간 정보를 하나의 일관된 클래스로 수집하여 모든 변환을 수행할 수 있도록 하는 것입니다.예를 들어, 다음과 같은 경우도 마찬가지입니다.

>>> SimpleDate(1293858000, tz='utc').date
datetime.date(2011, 1, 1)

]

당신이 가지고 있는 것을 고려하면datetime라고 하는 오브젝트dUTC 의 타임스탬프를 취득하려면 , 다음의 순서를 사용합니다.

d.strftime("%Y-%m-%dT%H:%M:%S.%fZ")

반대 방향의 경우 다음을 사용합니다.

d = datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%fZ")

난 이게 좋아, 함수를 통과해

from datetime import timezone, datetime, timedelta 
import datetime


def utc_converter(dt):
    dt = datetime.datetime.now(timezone.utc)
    utc_time = dt.replace(tzinfo=timezone.utc)
    utc_timestamp = utc_time.timestamp()
    return utc_timestamp



# create start and end timestamps
_now = datetime.datetime.now()
str_start = str(utc_converter(_now))
_end = _now + timedelta(seconds=10)
str_end = str(utc_converter(_end))

깊은 토론에 감명받았어요

내 2센트:

from datetime import datetime
import time

utc의 타임스탬프는 다음과 같습니다.

timestamp = \
    (datetime.utcnow() - datetime(1970,1,1)).total_seconds()

또는,

timestamp = time.time()

같은 DST에서 datetime.now()의 결과일 경우

utcoffset = (datetime.now() - datetime.utcnow()).total_seconds()
timestamp = \
    (now - datetime(1970,1,1)).total_seconds() - utcoffset

언급URL : https://stackoverflow.com/questions/8777753/converting-datetime-date-to-utc-timestamp-in-python

반응형