Python에서 UTC 시간을 얻는 방법은 무엇입니까?


113

StackExchange에서 솔루션을 검색했지만 필요한 것은 아무것도 없습니다. JavaScript에서는 1970 년 1 월 1 일 이후 UTC 시간을 계산하기 위해 다음을 사용하고 있습니다.

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

동등한 Python 코드는 무엇입니까?



잠깐, Python 또는 JavaScript를 사용하고 있습니까?
CheetSheatOverlode

답변:


179

datetime.utcnow () 사용하는 다음 코드를 시도하십시오 .

from datetime import datetime
datetime.utcnow()

두 날짜 사이에 소요 된 시간을 계산해야 할 때 필요한 것은 종료 날짜와 시작 날짜를 빼는 것뿐입니다. 이러한 뺄셈의 결과는 timedelta 객체입니다.

파이썬 문서에서 :

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

이것은 기본적으로 정의에 언급 된 모든 필드 (일, 초, 마이크로 초, 밀리 초, 분, 시간, 주)를 가져올 수 있음을 의미합니다. 또한 timedelta 인스턴스에는 다음과 같은 total_seconds () 메서드가 있습니다.

기간에 포함 된 총 초 수를 반환합니다. (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6 (true division이 활성화 된 상태로 계산 됨)에 해당합니다.


2
datetime.utcnow ()에 대한 끔찍한 놀라움은 이름에도 불구하고 시간대 인식 객체를 반환하지 않는다는 것입니다. 이것은 내 의견으로는 큰 문제이므로 아래의 대답을 선호합니다. "시간대가없는 datetime 객체는 응용 프로그램에서"버그 "로 간주되어야합니다."를 참조하십시오. julien.danjou.info/python-and-timezones
Tim Richardson

1
소위 순진한 datetime 객체 (즉, 시간대 정보가 설정되지 않음)의 개념은 목적에 부합합니다. 세계 어디에서나 매일 06:00:00에 알람 시계가 울리기를 원합니다. 또한 컴퓨터 게임에서 "가상 시계"를 허용합니다. 지금은 내 판타지 세계에서 오후 5시입니다. timezone을 datetime 객체에 강제하는 것은 특히 timedelta 산술에서 어색합니다.
DustByte

42

원본에 가장 가까운 형식 :

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

네이티브 Python datetime이 아닌 1970-01-01의 초 수를 알아야하는 경우 대신 다음을 사용하세요.

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

파이썬은 자바 스크립트에서 사용했던 것과 상충되는 명명 규칙을 가지고 있습니다 . PEP 8을 참조하십시오 . 또한 단순히 다른 함수의 결과를 반환하는 함수는 다소 어리 석습니다. 더 쉽게 액세스 할 수 있도록하는 문제라면 단순히 할당하여 함수의 다른 이름을 만들 수 있습니다. 위의 첫 번째 예는 다음으로 대체 될 수 있습니다.

utc_now = datetime.datetime.utcnow

1
나는 위에서 높은 등급의 답변보다 귀하의 답변을 더 좋아합니다. 여기 깊이 감사합니다.
Jordan Dea-Mattson 2013

@Jordan, 내 대답을 되돌아 보면 글로벌 수준이 아닌 함수 내부에 가져 오기를 넣어 문체 실수를 저질렀다는 것을 알고 있습니다. 지금 수정하겠습니다.
Mark Ransom 2013

8
UtcNow ()를 다른 함수로 래핑하는 것이 좋습니다. 너무 간단합니다. 또한 밑줄을 사용하지 마십시오. PEP 8은 너무 지루합니다 ...
vcarel 2014

1
확실히 간단한 한 줄짜리를 반환하는 함수를 작성할 필요는 없습니다. datetime.datetime.utcnow ()
cpreid

1
@TimRichardson 동의하지 않지만이 답변이 작성되었을 때 대안이 없었습니다 .Python에는 tzinfoUTC에도 객체가 포함되지 않았습니다 .
Mark Ransom

31

최신 파이썬을위한 단순한 표준 라이브러리입니다. .NET과 달리 시간대 인식 datetime을 제공합니다 datetime.utcnow(). datetimes시간대가 없으면 사고가 발생하기를 기다리고 있습니다.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)

5
Python 3 문서에 따르면 이것이 권장되는 방법입니다.
roskakori

깨끗하고 쉽습니다! 선호하는 방법이어야합니다.
Marry35

21
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 

10

datetime.datetime에서 strftime 메소드를 사용하여 이미 타임 스탬프로 내보낼 수 있습니다. 함수 예를 따르십시오.

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

마이크로 초를 원하는 경우 내보내기 문자열을 변경하고 다음과 같이 부동으로 캐스트해야합니다. return float(now.strftime("%s.%f"))


숫자를 직접 얻을 수있을 때 문자열로 변환 한 다음 다시 숫자로 변환하는 이유는 무엇입니까?
Mark Ransom

요점은 함수의 내용을 변경하고 싶을 time.time()수 있으므로을 사용 하지 않고 datetime 객체 를 사용하는 것이 좋습니다. time.mktime (now.timetuple ())을 사용하여 직접 int로 변환 할 수도 있습니다. 어쨌든,이 간단한 경우 time.time()도 유효한 옵션입니다. 내가 이상하다고 생각하는 것은 초를 찾기 위해 timedelta로 이동하는 것입니다.
hectorcanto

이는 strftime("%s")플랫폼에 따라 다르며 Windows에서는 작동하지 않습니다. (적어도 Windows 10에서는 그렇지 않습니다).
Julian Kirsch

8

외부 종속성이없는 시간대 인식 :

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)

-4

람다 식을 사용하는 Python 3에서 시도해보십시오.

from datetime import datetime
utc_now = lambda : datetime.utcnow()

정상적으로 함수를 호출하십시오.

print(utc_now())

2
이제 멋지다; ^)
Demis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.