파이썬의 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.