Làm cách nào để chuyển đổi một chuỗi trong định dạng "%d/%m/%Y"
sang dấu thời gian?
"01/12/2011" -> 1322697600
Làm cách nào để chuyển đổi một chuỗi trong định dạng "%d/%m/%Y"
sang dấu thời gian?
"01/12/2011" -> 1322697600
Câu trả lời:
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
calendar.timegm()
hoặc.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
ngắn hơn một chút
.timestamp()
giả định giờ địa phương thay vì UTC nếu không có múi giờ rõ ràng được đưa ra. Mã trong câu trả lời chỉ hoạt động (dự kiến sản xuất 1322697600
) trên máy tính có múi giờ cục bộ có độ lệch utc bằng không.
Tôi sử dụng ciso8601
, nhanh hơn 62 lần so với thời gian của datetime.
t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())
Bạn có thể tìm hiểu thêm ở đây .
Để chuyển đổi chuỗi thành một đối tượng ngày:
from datetime import date, datetime
date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()
Cách chuyển đổi đối tượng ngày thành dấu thời gian POSIX phụ thuộc vào múi giờ. Từ Chuyển đổi datetime.date
sang dấu thời gian UTC trong Python :
đối tượng ngày đại diện cho nửa đêm trong UTC
import calendar
timestamp1 = calendar.timegm(utc_date.timetuple())
timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
assert timestamp1 == timestamp2
đối tượng ngày đại diện cho nửa đêm trong giờ địa phương
import time
timestamp3 = time.mktime(local_date.timetuple())
assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
Dấu thời gian là khác nhau trừ khi nửa đêm ở UTC và theo giờ địa phương là cùng thời gian.
NameError: name 'wckCalendar' is not defined
. Tôi đang chạy Python 3.4.1 trên máy Windows 32 bit. Bất kỳ ý tưởng? Cảm ơn.
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%s"
không được Python hỗ trợ . Nó không phải là di động.
Câu trả lời cũng phụ thuộc vào múi giờ ngày đầu vào của bạn. Nếu ngày của bạn là một ngày địa phương, thì bạn có thể sử dụng mktime () như katrielalex đã nói - chỉ tôi không thấy lý do tại sao anh ấy sử dụng datetime thay vì phiên bản ngắn hơn này:
>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0
Nhưng hãy quan sát rằng kết quả của tôi khác với anh ấy, vì tôi có thể ở một TZ khác (và kết quả là dấu thời gian UNIX không có múi giờ)
Bây giờ nếu ngày đầu vào đã có trong UTC, tôi tin rằng giải pháp phù hợp là:
>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
Đơn giản chỉ cần sử dụng datetime.datetime.strptime
:
import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())
Kết quả:
1322697600
Để sử dụng UTC thay vì múi giờ địa phương, hãy sử dụng .replace
:
datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()
float
khôngint
Rất nhiều câu trả lời không bận tâm để xem xét rằng ngày bắt đầu là ngây thơ
Để chính xác, trước tiên bạn cần đặt ngày ngây thơ thành một mốc thời gian nhận biết múi giờ
import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)
# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)
# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)
# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0
Cũng thế:
Hãy cẩn thận, sử dụng pytz
cho tzinfo
một datetime.datetime
công việc không nhiều múi giờ. Xem datetime với múi giờ pytz. Độ lệch khác nhau tùy thuộc vào cách đặt tzinfo
# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!
# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset
Tôi muốn đề xuất dateutil :
import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
"%d/%m/%Y"
định dạng. So sánh: dateutil.parser.parse("01/02/2001")
vàdatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600
trừ khi múi giờ địa phương của bạn là UTC. Xem bình luận của tôi từ 2014
Có vẻ là khá hiệu quả:
import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
1,61 Khen ± 120 ns mỗi vòng lặp (trung bình ± std. Dev của 7 lần chạy, mỗi vòng 100000)
datetime
chức năng? datetime
từ datetime
thư viện không hỗ trợ.timestamp()
chỉ cần sử dụng datetime.timestamp (instetime instanse của bạn), thể hiện datetime chứa thông tin múi giờ, do đó dấu thời gian sẽ là dấu thời gian utc tiêu chuẩn. nếu bạn chuyển đổi datetime thành timetuple, nó sẽ mất múi giờ, do đó, kết quả sẽ là lỗi. nếu bạn muốn cung cấp một giao diện, bạn nên viết như thế này: int (datetime.timestamp (time_instance)) * 1000
Bạn có thể tham khảo liên kết sau đây để sử dụng strptime
chức năng từ datetime.datetime
, để chuyển đổi ngày từ bất kỳ định dạng nào cùng với múi giờ.
https://docs.python.org/3/lvern/datetime.html#strftime-and-strptime-behavior
bạn có thể chuyển đổi sang isoformat
my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()
Một chức năng đơn giản để có được thời gian Epoch UNIX.
LƯU Ý : Hàm này giả sử thời gian ngày đầu vào ở định dạng UTC (Tham khảo ý kiến tại đây).
def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
import datetime, calendar
ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
return calendar.timegm(ts.utctimetuple())
Cách sử dụng :
>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600