Chuyển đổi chuỗi dấu thời gian unix thành ngày có thể đọc được


825

Tôi có một chuỗi đại diện cho dấu thời gian unix (tức là "1284101485") trong Python và tôi muốn chuyển đổi nó thành một ngày có thể đọc được. Khi tôi sử dụng time.strftime, tôi nhận được TypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str

1
liên kết đến câu hỏi để chuyển đổi trở lại quá: stackoverflow.com/q/19801727/3273031
lầy lội

Câu trả lời:


1210

Sử dụng datetimemô-đun:

from datetime import datetime
ts = int("1284101485")

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))

131
.fromtimestamp()có thể thất bại trong những ngày qua nếu múi giờ địa phương có độ lệch utc khác nhau. Bạn cần một cơ sở dữ liệu múi giờ lịch sử như được cung cấp bởi pytzmô-đun (hoặc hệ điều hành của bạn). Hoặc chỉ làm việc trong UTC và sử dụng .utcfromtimestamp().
jfs

9
@JFSebastian Bạn đã đề cập đến điều này có thể thất bại trong một vài bình luận - xin vui lòng bạn có thể giải thích lý do tại sao nó sẽ thất bại cho một ngày / lần trước? (Đánh giá bởi các upvote, nhiều người đều đồng ý với bạn và xem điều này là đơn giản) Chắc chắn bất kỳ dấu thời gian unix nào cũng có ngày / giờ tương đương đơn giản?
davidhood2

3
@ davidhood2 lấy một hệ thống mà python không có quyền truy cập vào cơ sở dữ liệu tz (Windows), đặt múi giờ địa phương của bạn thành múi giờ có bù UTC khác trong quá khứ (ví dụ: Châu Âu / Moscow), gọi từtimestamp () bằng dấu thời gian từ quá khứ (2011-). So sánh kết quả với các giá trị được tính toán bằng cách sử dụng pytz. Nếu nó không rõ ràng; hỏi một câu hỏi Stack Overflow riêng biệt.
jfs


6
Một điểm nhập là cái này mất một dấu thời gian tính bằng giây kể từ thời đại; nếu bạn có mili giây bạn phải chia cho 1000 như tôi vừa tìm ra.
lời giới thiệu


145

Câu trả lời được bình chọn nhiều nhất cho thấy sử dụng fromtimestamp dễ bị lỗi vì nó sử dụng múi giờ địa phương. Để tránh các vấn đề, cách tiếp cận tốt hơn là sử dụng UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

Trong đó posix_time là thời gian Posix epoch bạn muốn chuyển đổi


2
nhập datetime, pytz datetime.datetime (1990, 1, 1, tzinfo = pytz.utc)
y.selivonchyk

76
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'

10
time.ctime()time.localtime()có thể thất bại trong những ngày qua nếu múi giờ địa phương có độ lệch utc khác nhau. Bạn cần một cơ sở dữ liệu múi giờ lịch sử như được cung cấp bởi pytzmô-đun (hoặc hệ điều hành của bạn). Hoặc chỉ làm việc trong UTC và sử dụng time.gmtime(). datetimecó thể cung cấp phạm vi ngày rộng hơn để datetime.utcfromtimestamp()có thể được sử dụng thay vì các timechức năng.
jfs

66

Có hai phần:

  1. Chuyển đổi dấu thời gian unix ("giây kể từ epoch") sang giờ địa phương
  2. Hiển thị giờ địa phương ở định dạng mong muốn.

Một cách di động để có được giờ địa phương hoạt động ngay cả khi múi giờ địa phương có phần bù utc khác trong quá khứ và python không có quyền truy cập vào cơ sở dữ liệu tz là sử dụng pytzmúi giờ:

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)

Để hiển thị nó, bạn có thể sử dụng bất kỳ định dạng thời gian nào được hệ thống của bạn hỗ trợ, ví dụ:

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format

Nếu bạn không cần giờ địa phương, để có được thời gian UTC có thể đọc được:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

Nếu bạn không quan tâm đến các vấn đề múi giờ có thể ảnh hưởng đến ngày nào được trả về hoặc nếu python có quyền truy cập vào cơ sở dữ liệu tz trên hệ thống của bạn:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

Trên Python 3, bạn có thể nhận được datetime nhận biết múi giờ chỉ bằng stdlib (phần bù UTC có thể sai nếu python không có quyền truy cập vào cơ sở dữ liệu tz trên hệ thống của bạn, ví dụ: trên Windows):

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))

Các chức năng từ timemô-đun là các trình bao bọc mỏng xung quanh API C tương ứng và do đó chúng có thể kém khả dụng hơn các datetimephương thức tương ứng nếu không bạn cũng có thể sử dụng chúng:

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  

Nó sẽ là câu trả lời được bình chọn nhiều nhất nếu bạn quan tâm đến giờ địa phương.
azzamsa

36

Đối với dấu thời gian có thể đọc được của con người từ dấu thời gian UNIX, tôi đã sử dụng điều này trong các tập lệnh trước đây:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

Đầu ra:

'Ngày 26 tháng 12 năm 2012'


25

Bạn có thể chuyển đổi thời gian hiện tại như thế này

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

Để chuyển đổi một ngày trong chuỗi thành các định dạng khác nhau.

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013

24

Khác với việc sử dụng gói thời gian / thời gian , gấu trúc cũng có thể được sử dụng để giải quyết vấn đề tương tự. Đây là cách chúng ta có thể sử dụng gấu trúc để chuyển đổi dấu thời gian thành ngày có thể đọc được :

Dấu thời gian có thể có hai định dạng:

  1. 13 chữ số (mili giây) - Để chuyển đổi mili giây thành ngày, sử dụng:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 chữ số (giây) - Để chuyển đổi giây thành ngày, sử dụng:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'

Một chiến thắng khác cho gấu trúc dường như - mô-đun là tuyệt vời ở mọi thứ
Vaidøtas Ivøška

21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Nhận ngày có thể đọc được từ dấu thời gian cũng theo thời gian, bạn cũng có thể thay đổi định dạng của ngày.


5
Câu trả lời này thêm gì vào câu trả lời này ?
kocica

1
Vui lòng thêm một cảnh báo liên quan đến vấn đề giả định múi giờ địa phương. Thực tiễn tốt nhất trong lập trình là lưu trữ dấu thời gian dưới dạng thời gian UTC thay vì dấu thời gian cục bộ. Nhưng ví dụ trên sẽ trả về thời gian sai nếu múi giờ địa phương không phải là UTC.
Timothy C. Quinn

20

Trong Python 3.6+:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

Đầu ra:

2020-01-15 19:51:41

Giải trình:


6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp

6

Một cách khác mà điều này có thể được thực hiện bằng cách sử dụng chức năng gmtime và định dạng;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

Đầu ra: 2018-10-4 11:57:44


1

tôi vừa mới sử dụng thành công:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date

0

nhanh chóng và bẩn một lớp lót:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-5-1-9-43'


3
Hoặc chính xác hơn: '-'. Tham gia (map (str, datetime.datetime.now (). Timetuple () [: 6]))
Jelle Zijlstra

2
@JelleZijlstra Eh, tôi thích biểu thức tạo hơn bản đồ.
crhodes

4
Loại định dạng ngày nào là '2013-5-5-1-9-43'? Tôi chưa bao giờ thấy định dạng này ở bất cứ đâu như một đại diện hợp lệ của ngày / giờ.
madoki

bạn có thể giải thích về những gì đủ điều kiện này là đại diện không hợp lệ @madoki không? bạn có nghĩa là không chuẩn? Ưu điểm chính của nó so với hầu hết các câu trả lời khác là khả năng đưa nó vào đường dẫn tệp hoặc thư mục, vì khoảng trắng và dấu hai chấm không nằm trong tập hợp các ký tự thư mục unix tiêu chuẩn. xem ví dụ stackoverflow.com/a/458001/209246
eqzx

0

Bạn có thể sử dụng easy_date để làm cho nó dễ dàng:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

5
Mỗi chương trình đều có bộ chuyển đổi ngày và thời gian riêng. Không bao giờ phải sử dụng các mod / khung cho việc này
JosFabre

strptimestrftimekhông trực quan ... Và thậm chí không thể đọc được ... Nhưng tôi hiểu và tôn trọng ý kiến ​​của bạn
Raphael Amoedo

4
Điều đó "không bao giờ phải sử dụng" là sai. Nó phụ thuộc vào ngôn ngữ và chất lượng của libs tích hợp. Javascript có khoảnh khắc.js và Java có thời gian Joda, cả hai đều phổ biến hơn so với các tiện ích chuyển đổi ngày và giờ tích hợp tương ứng (rất nhiều thời gian sau đó Joda ảnh hưởng đến các lib chuẩn cập nhật của Java 8). Điều đó nói rằng, trừ khi câu hỏi yêu cầu các thư viện bên thứ ba tốt đẹp, tốt nhất là đưa ra câu trả lời dựa trên thư viện chuẩn.
Hejazzman

Tôi đứng sửa @NikosVentouras. Lần đầu tiên tôi mới gặp vấn đề "Ngày JS trong IE hành xử khác". Vì vậy, tôi đã kết thúc bằng khoảnh khắc.js
JosFabre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.