파이썬의 time.time ()은 로컬 또는 UTC 타임 스탬프를 반환합니까?


559

않습니다 time.time()파이썬 시간 모듈에서 시스템의 시간 또는 UTC에서 시간을 반환?


87
타임 스탬프에는 시간대가 없습니다. 신기원부터 몇 초를 나타냅니다. 신기원은 시간대에 의존하지 않는 특정 시점입니다.
— jwg

2
@jwg : 일반적으로 사용되는 POSIX 타임 스탬프는 윤초를 계산하지 않으므로 "에포크 이후 [경과 된 SI] 초 수"(가까운)가 아닙니다.
— jfs

7
나는 이것이 @JFSebastian의 정확한 반대라고 생각하지 않습니다. 윤초는 '에포크 이후 경과 된 초'가 아닙니다. 이들은 경과 된 초에 해당하지 않는 시계에 의해 기록 된 시간 표현의 변화입니다.
— jwg 2012

4
@JFSebastian 혼란을 드려 죄송합니다. 윤초는 '경과 초'가 아닙니다. 따라서 '경과 된 초 수'인 타임 스탬프에는 윤초가 포함되지 않아야합니다.
— jwg 2012

2
@jwg 잘못되었습니다. 실제 시간은 지울 수 없습니다. POSIX 타임 스탬프는 경과 된 SI 초의 수가 아닙니다. 예를 들면 다음과 같습니다. 뉴욕의 "2016 년 12 월 31 일 오후 6:59:59 pm"과 "2016 년 12 월 31 일 오후 7:01 오후"사이에 3 초가 경과했지만 해당 POSIX 타임 스탬프의 차이는 2 초에 불과합니다 ( 윤초는 계산되지 않습니다).
— jfs

답변:


780

이 time.time()함수는 에포크 이후 초 수를 초 단위로 반환합니다. "epoch"는 1970 년 1 월 1 일의 시작으로 UTC로 정의됩니다. 따라서이 에포크 (epoch)는 UTC로 정의되며 글로벌 시간을 설정합니다. "epoch 지난 시간"(time.time ())이 어디에 있든지 같은 순간에 같은 값을 반환합니다.

다음은 컴퓨터에서 실행 한 일부 샘플 출력이며 문자열로 변환합니다.

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>

ts변수는 초 단위로 반환되는 시간입니다. 그런 다음 datetime라이브러리를 사용하여 문자열을 사람이 읽을 수있는 문자열 로 변환했습니다 .


72
import timedatetime이 기본적으로 타임 스탬프를 제공하는 이유는 무엇입니까? 밀리 초를 제거하십시오 –str(datetime.datetime.now()).split('.')[0]
— Hussain

17
@Alexis Unix epoch는 여기서 매우 명확하게 정의 됩니다 . 심지어 페이지 아래로 파이썬 예제를 지적합니다. 귀하의 의견을 이해하지 못합니다.
— squiguy

9
@squiguy 정직하게 말한 것을 기억하지 못했습니다. 나는 무언가를 잘못 읽었어야했고, 프랑스와 미국을 옮길 때 일부 테스트가 왜 실패했는지 알아 내기 위해 고군분투하고있었습니다. 마침내이 문제가 DST 때문인 것으로 밝혀졌습니다. 그것에 대해 미안하고 이것을 지적 해 주셔서 감사합니다.
— Alexis

5
"UTC 초" 가 아닙니다 . . 에 의해 반환 된 타임 스탬프 time.time()가 시간대에 없습니다 . "에포크 이후의 초"는 용어입니다. 특정 시점 (에포크) 이후 경과 된 시간 (초) 이 아닙니다 . 현지 시간 (tz 데이터베이스 사용) 및 / 또는 UTC 시간대로 쉽게 변환 할 수 있습니다. btw, .strftime()결과 를 삭제 하면 (거의) 동일한 (+/- 마이크로 초)입니다.
— jfs

3
그냥 테스트로 time.time ()는 UTC 시간을 제공하지 않습니다, 내 로컬 영역 시간 제공
— sliders_alpha

301

텍스트 파일에서 사용할 수 있는 타임 스탬프 의 텍스트 형식입니다 . (과제의 질문 제목은 과거에 다르므로이 답변에 대한 소개가 시간으로 해석 될 수있는 방법을 명확히하기 위해 변경되었습니다. [2016-01-14 업데이트])

당신은 사용하여 문자열로 타임 스탬프를 얻을 수 있습니다 .now()또는 .utcnow()의를 datetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

now에서 다릅니다 utcnow: 그렇지 않으면 같은 방식으로 작동 - 예상대로

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

타임 스탬프를 문자열에 명시 적으로 렌더링 할 수 있습니다.

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'

또는 타임 스탬프의 형식을 원하는 방식으로 명시 적으로 지정할 수 있습니다.

>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'

ISO 형식을 원하면 .isoformat()객체 의 방법을 사용하십시오 .

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

변환없이 계산 및 인쇄를 위해 변수에이를 사용할 수 있습니다.

>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980

1
나뿐만 명령로 time.time ()의 내 언급에서 분명했다 ...없는 날짜 형식에 .... 신기원 시간을 원
— Saransh Mohapatra

34
알았어, 문제 없어 다른 사람이 텍스트 파일에 배치 하려면 타임 스탬프를 사용해야 할 수도 있습니다.
— pepr

1
나는 불합리한 수의 투표 로 인해 여기에 리디렉션 된 또 다른 사람 입니다. 가장 많이 사용되는 서버 시간대에서 사람이 읽을 수있는 접미사 (파일 이름 등)를 얻는 것이 일반적인 요구에 맞지 않는 질문의 형식이 잘못되었고 허용되는 답변입니다.

문자열의 일부로 타임 스탬프를 인쇄하려면 다음을 사용하십시오. Python2 : import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3 :import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
— Mr-IDE

datetime.datetime.utcnow()악하다. 현지 시간이 아닌 순진한 날짜 시간을 만듭니다. 현지 시간이 UTC가 아닌 한 잘못되었습니다. datetime.datetime.now(datetime.timezone.utc)대신 사용하십시오 . 현재 시간을 나타내는 시간대 인식 날짜 시간을 작성합니다.
— Terrel Shumway

139

#squiguy의 답변을 기반으로 진정한 타임 스탬프를 얻으려면 float에서 캐스트하십시오.

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

적어도 그것이 개념입니다.


1
타임 스탬프를 타입 캐스팅하는 이유는 무엇입니까? 기본적으로 유형은 무엇입니까?
— Tizzee

3
@Tizzee type(time.time())제공<type 'float'>
— famousgarkin

4
그러나 초보다 정확한 시간이 필요한 경우 플로트가 적합합니다.
— pepr

3
@RudiStrydom : 파이썬은 강력하게 타이핑됩니다. 정적으로 입력하는 것과 혼동하지 마십시오.
— jfs

1
@CheokYanCheng : int()다형성입니다. long이전 Python 버전에서 필요한 경우 반환 됩니다. 모든 정수는 새로운 Python 버전입니다.
— jfs

30

대답은 둘 다 또는 둘 다일 수 있습니다.

  • none : time.time()Epoch 이후 경과 된 시간 (초)을 반환합니다. 결과는 시간대에 의존하지 않으므로 UTC 또는 현지 시간이 아닙니다. 다음 은 "에포크 이후 두 번째"에 대한 POSIX 정의입니다 .

  • 둘 다 : time.time()시스템의 시계가 동기화 될 필요가 없으므로 값을 반영합니다 (현지 시간대와 아무런 관련이 없지만). 컴퓨터마다 다른 결과가 동시에 나타날 수 있습니다. 반면에 컴퓨터 시간 이 동기화되면 타임 스탬프에서 UTC 시간을 쉽게 얻을 수 있습니다 (윤리 초를 무시하는 경우).

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)

다양한 Python 버전에서 UTC 시간에서 타임 스탬프를 얻는 방법은 UTC에 따라 에포크 이후 날짜를 초로 변환하려면 어떻게합니까?를 참조하십시오.


4
이것은 정확하게 언급되는 유일한 해답 datetime.utcfromtimestamp308 upvotes가와 답변에가있는 동안 datetime.fromtimestamp:-(

@TerrelShumway 질문은 time.time()함수가 무엇을 반환 하는지에 관한 것 입니다 (매우 짧습니다). 귀하의 의견은 다른 질문을 다룹니다 (답변을 시작한 이후로 귀하의 의견이 변경되었습니다. 따로 메모; "올바른"이라는 단어는 드물게 사용해야합니다 (시간대는 복잡합니다. 은색 글 머리 기호는 없으며 특정 사용 사례에 대한 타협점 만 있음).
— jfs

사용하지 마십시오 datetime.datetime.utcfromtimestamp(ts). 현지 시간이 UTC가 아닌 한 현지 시간이 아닌 순진한 날짜 시간을 만들기 때문에 잘못되었습니다. datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)대신 사용하십시오 . 타임 스탬프와 동일한 순간을 나타내는 시간대 인식 날짜 시간을 만듭니다.
— Terrel Shumway

예. 내 이전 의견이 잘못되었습니다. datetime 모듈의 코드 대부분은 순진한 날짜 시간을 현지 시간으로 처리합니다. 순진한 날짜 시간을 사용하는 것은 인코딩을 몰라도 텍스트 파일을 여는 것과 같습니다.
— Terrel Shumway 4

@TerrelShumway UTC 시간이 현지 시간 인 시스템에서만 사용될 수 있다고 가정하는 것은 잘못입니다. stdlib의 일부는 순진한 datetime 객체를 현지 시간대를 갖는 것으로 간주합니다 (유감스럽게도). 파이썬 3에 더 이상 존재 naive_dt.astimezone()하지 않는 것처럼 존재하지 않는 것을 선호합니다 bytes.encode(). 많은 경우 내부에서 UTC 시간으로 작업하는 것이 유리합니다. datetime 모듈에 대해 말할 수있는 많은 것들이 있습니다 (골드 배지를 얻기 위해 충분한 질문에 대답했습니다) time.time().
— jfs

4

나는 결국 정착했다.

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0

1
그것은 당신의 지역 요구를 만족시킬 수 있지만, [GMT] 시대 이후 그 범위의 숫자가 몇 초가 될 것으로 기대하는 사람들에게는 오도의 소지가 있습니다. time.time()십진수 / 부동처럼 리턴 1574115250.818733하고 밀리 초-후는 쉽게 int(time.time() * 1000)예를 들어1574115254915
— MarkHu

3

특정 시간대에는 "에포크"와 같은 것이 없습니다. 신기원은 특정 시점으로 잘 정의되어 있으므로 시간대를 변경하면 시간 자체도 변경됩니다. 구체적으로이 시간은 Jan 1 1970 00:00:00 UTC입니다. 따라서 time.time()에포크 이후 초 수를 반환합니다.


UTC가 표준 시간대가 아니라 표준 시간대 인 것은 사실이지만 표준은 GMT와 동일한 시간을 공유한다는 것입니다. 그래서 ....
— 크레이그 cks 스

3

타임 스탬프는 항상 utc의 시간이지만 호출 datetime.datetime.fromtimestamp 하면이 타임 스탬프에 해당하는 현지 시간대로 시간이 반환되므로 결과는 로캘에 따라 다릅니다.

>>> import time, datetime

>>> time.time()
1564494136.0434234

>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)

arrow다른 행동을 가진 멋진 도서관 이 있습니다. 같은 경우 UTC 시간대를 사용하여 시간 객체를 반환합니다.

>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.