Tôi có một datetime
đối tượng Python mà tôi muốn chuyển đổi thành thời gian unix hoặc giây / mili giây kể từ kỷ nguyên 1970.
Làm thế nào để tôi làm điều này?
$ python -c 'import time; print(time.time())'
đưa ra:1584487455.698623
Tôi có một datetime
đối tượng Python mà tôi muốn chuyển đổi thành thời gian unix hoặc giây / mili giây kể từ kỷ nguyên 1970.
Làm thế nào để tôi làm điều này?
$ python -c 'import time; print(time.time())'
đưa ra:1584487455.698623
Câu trả lời:
Theo tôi, cách đơn giản nhất để làm điều này là
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
phụ thuộc vào hệ điều hành! Do đó, bất cứ ai cũng muốn mã hoạt động một cách đáng tin cậy bất kể hệ điều hành nào, KHÔNG BAO GIỜ nên sử dụng %s
. Cho 2,3 <py ver <2.7. Người ta có thể chỉ cần xây dựng một cái total_seconds()
như thế này:delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
phải ở UTC (không phải cục bộ). Xem câu trả lời tương tự với hỗ trợ Python 2.6 / 3
utcfromtimestamp(0)
có thể gây ra độ lệch 'tz' chỉ khi 'tz' không bằng 0. Điều này là do dt
in dt- epoch
'tz' được tính trong đó khi epoch là thời gian UTC. Cách tốt nhất để tính kỷ nguyên là epoch = datetime.datetime(1970, 1, 1)
nơi xem xét múi giờ.
datetime.utcfromtimestamp(0)
trả lại một datetime mà không có tzinfo? Nó có ngay trong tên phương thức, utc fromtimestamp. Để làm cho nó không ngây thơ, tôi phải làm một cái gì đó như thế datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
. Điều này là cần thiết nếu dt
nhận biết múi giờ nếu không bạn sẽ nhận đượcTypeError: can't subtract offset-naive and offset-aware datetimes
Trong Python 3.3, đã thêm phương thức mới timestamp
:
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
Câu hỏi của bạn nói rằng bạn cần một phần nghìn giây mà bạn có thể nhận được như thế này:
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
Nếu bạn sử dụng timestamp
trên một đối tượng datetime ngây thơ, thì nó giả định rằng nó nằm trong múi giờ địa phương. Sử dụng các đối tượng datetime nhận biết múi giờ nếu đây không phải là điều bạn định xảy ra.
.timestamp()
phương thức giả định rằng một datetime đầu vào ngây thơ nằm trong múi giờ cục bộ (và giờ địa phương có thể không rõ ràng). Nếu nó ở trong UTC thì sử dụng dt.replace(tzinfo=timezone.utc).timestamp()
thay thế .
datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
nhưng không (luôn luôn) bằng datetime.datetime.now().timestamp()
(cái cuối cùng này chỉ bằng phần còn lại nếu tz cục bộ là UTC ...)
fromtimestamp
( docs.python.org/3/l Library / Khăn )
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000
1312908481000
Hoặc sự trợ giúp của mô-đun thời gian (và không có định dạng ngày):
>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0
Đã trả lời với sự giúp đỡ từ: http://pleac.sourceforge.net/pleac_python/datesandtimes.html
Tài liệu:
.timetuple()
trả lại tm_isdst=-1
nó buộc mktime()
phải đoán. Nó có thể đoán sai trong DST (50% khả năng xảy ra lỗi +/- giờ). Cả '% s' và mktime()
có thể sử dụng offset utc sai cho các ngày từ quá khứ. Bạn cần một db múi giờ lịch sử, chẳng hạn như được cung cấp bởi pytz
mô-đun để chuyển đổi đáng kể thời gian địa phương sang dấu thời gian POSIX (trừ khi HĐH đã cung cấp db như vậy)
time.mktime(ts.timetuple())
Trong đó ts là đối tượng thời gian của python
mktime/timetuple
. Ngoài ra timetuple()
dải phân số của một giây và điểm của câu hỏi là lấy dấu thời gian với độ chính xác mili giây.
Bạn có thể sử dụng Delorean để du hành trong không gian và thời gian!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
http://d Bachelorean.readthedocs.org/en/latest/quickstart.html
Đây là cách tôi làm điều đó:
from datetime import datetime
from time import mktime
dt = datetime.now()
sec_since_epoch = mktime(dt.timetuple()) + dt.microsecond/1000000.0
millis_since_epoch = sec_since_epoch * 1000
Các đề xuất từ tài liệu Python 2.7 cho time
mô-đun
time
mô-đun, nhưng OP đã hỏi về datetime
mô-đun. FWIW, kỷ nguyên đơn giản nhất hiện tại làint(time.time())
from datetime import datetime
from calendar import timegm
# Note: if you pass in a naive dttm object it's assumed to already be in UTC
def unix_time(dttm=None):
if dttm is None:
dttm = datetime.utcnow()
return timegm(dttm.utctimetuple())
print "Unix time now: %d" % unix_time()
print "Unix timestamp from an existing dttm: %d" % unix_time(datetime(2014, 12, 30, 12, 0))
timegm()
chỉ hoạt động với thời gian utc. Nó không sử dụng tm_isdst
do đó bạn có thể sử dụng utcnow.timetuple()
thay vì utcnow.utctimetuple()
. Lưu ý: sử dụng naive_local_datetime.utctimetuple()
sẽ sai ở đây. Nó không dịch giờ địa phương sang utc. Cũng timetuple()
gọi các phân số dải của một giây từ kết quả (cho dù nó quan trọng phụ thuộc vào ứng dụng). Ngoài ra câu hỏi hỏi về * milli * giây, không phải giây
utctimetuple()
dải phân số của một giây. Nhân với 1000
sẽ không nhận được chúng trở lại.
>>> import datetime
>>> import time
>>> import calendar
>>> #your datetime object
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 3, 19, 13, 0, 9, 351812)
>>> #use datetime module's timetuple method to get a `time.struct_time` object.[1]
>>> tt = datetime.datetime.timetuple(now)
>>> tt
time.struct_time(tm_year=2013, tm_mon=3, tm_mday=19, tm_hour=13, tm_min=0, tm_sec=9, tm_wday=1, tm_yday=78, tm_isdst=-1)
>>> #If your datetime object is in utc you do this way. [2](see the first table on docs)
>>> sec_epoch_utc = calendar.timegm(tt) * 1000
>>> sec_epoch_utc
1363698009
>>> #If your datetime object is in local timeformat you do this way
>>> sec_epoch_loc = time.mktime(tt) * 1000
>>> sec_epoch_loc
1363678209.0
[1] http://docs.python.org/2/l Library / datetime.html # datetime.date.timetuple
Đây là một hình thức khác của giải pháp với việc chuẩn hóa đối tượng thời gian của bạn:
def to_unix_time(timestamp):
epoch = datetime.datetime.utcfromtimestamp(0) # start of epoch time
my_time = datetime.datetime.strptime(timestamp, "%Y/%m/%d %H:%M:%S.%f") # plugin your time object
delta = my_time - epoch
return delta.total_seconds() * 1000.0
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000
* 1000
, mặc dù, bạn có được seconds_since_epoch
. Nâng cao câu trả lời này vì tôi không quan tâm đến mili giây ngay bây giờ.
Đây là một chức năng tôi đã thực hiện dựa trên câu trả lời ở trên
def getDateToEpoch(myDateTime):
res = (datetime.datetime(myDateTime.year,myDateTime.month,myDateTime.day,myDateTime.hour,myDateTime.minute,myDateTime.second) - datetime.datetime(1970,1,1)).total_seconds()
return res
Bạn có thể gói giá trị được trả về như thế này: str (int (res)) Để trả về nó mà không có giá trị thập phân được sử dụng dưới dạng chuỗi hoặc chỉ int (không có str)
Giải pháp khác này cho covert datetime thành unixtimestampmillis.
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long GetCurrentUnixTimestampMillis()
{
DateTime localDateTime, univDateTime;
localDateTime = DateTime.Now;
univDateTime = localDateTime.ToUniversalTime();
return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
}