मेरे पास एक पायथन datetime
ऑब्जेक्ट है जिसे मैं 1970 के युग से यूनिक्स समय, या सेकंड / मिलीसेकंड में बदलना चाहता हूं।
मैं यह कैसे करु?
$ python -c 'import time; print(time.time())'
जो दिया गया है:1584487455.698623
मेरे पास एक पायथन datetime
ऑब्जेक्ट है जिसे मैं 1970 के युग से यूनिक्स समय, या सेकंड / मिलीसेकंड में बदलना चाहता हूं।
मैं यह कैसे करु?
$ python -c 'import time; print(time.time())'
जो दिया गया है:1584487455.698623
जवाबों:
यह मुझे प्रतीत होता है कि ऐसा करने का सबसे सरल तरीका है
import datetime
epoch = datetime.datetime.utcfromtimestamp(0)
def unix_time_millis(dt):
return (dt - epoch).total_seconds() * 1000.0
%s
ओएस कार्यान्वयन निर्भर है! इस प्रकार कोई भी चाहता है कि कोड जिस पर चाहे OS काम करे, उसे कभी भी उपयोग नहीं करना चाहिए %s
। 2.3 <py ver <2.7 के लिए। एक बस total_seconds()
इस तरह का निर्माण कर सकता है :delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
UTC में होना चाहिए (स्थानीय नहीं)। देखें 2.6 / 3 समर्थन अजगर के साथ इसी तरह जवाब
utcfromtimestamp(0)
एक 'TZ' ऑफसेट केवल 'TZ' का कारण हो सकता 0. नहीं है इसका कारण यह है dt
में dt- epoch
है 'TZ' उस में गणना की जहां युग के रूप में UTC समय है। युग की गणना करने का सबसे अच्छा तरीका वह है epoch = datetime.datetime(1970, 1, 1)
जहां टाइमजोन विचार में है।
datetime.utcfromtimestamp(0)
tzinfo के बिना एक डेटाइम वापस क्यों करता है ? यह विधि नाम में वहीं है , यूटीटीमेस्टैम्प। इसे गैर-भोला बनाने के लिए मुझे कुछ ऐसा करना होगा datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
। यह आवश्यक है यदि dt
TypeError: can't subtract offset-naive and offset-aware datetimes
पायथन 3.3 में, नई विधि जोड़ी गई timestamp
:
import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()
आपके प्रश्न में कहा गया है कि आपको मिलीसेकंड की आवश्यकता है, जिसे आप इस तरह प्राप्त कर सकते हैं:
milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000
यदि आप timestamp
एक भोली डेटाइम ऑब्जेक्ट पर उपयोग करते हैं, तो यह माना जाता है कि यह स्थानीय समय क्षेत्र में है। यदि आप ऐसा करने का इरादा नहीं रखते हैं, तो टाइमजोन-अवगत डेटाटाइम ऑब्जेक्ट का उपयोग करें।
.timestamp()
विधि मानती है कि एक भोली इनपुट डेटाइम स्थानीय समय क्षेत्र में है (और स्थानीय समय अस्पष्ट हो सकता है)। यदि यह यूटीसी में है तो dt.replace(tzinfo=timezone.utc).timestamp()
इसके बजाय उपयोग करें ।
datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
लेकिन (हमेशा) बराबर नहीं datetime.datetime.now().timestamp()
(यह अंतिम केवल बाकी के बराबर है अगर स्थानीय tz UTC है ...)
fromtimestamp
( docs.python.org/3/library/… )
>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000
1312908481000
या समय मॉड्यूल की मदद (और दिनांक स्वरूपण के बिना):
>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0
से मदद के साथ जवाब दिया: http://pleac.sourceforge.net/pleac_python/datesandtimes.html
प्रलेखन:
.timetuple()
रिटर्न tm_isdst=-1
यह बलों mktime()
का अनुमान लगाना। यह डीएसटी के दौरान गलत अनुमान लगा सकता है (त्रुटि का 50% मौका +/- घंटा)। दोनों '% s' और mktime()
अतीत से तारीखों के लिए गलत utc ऑफसेट का उपयोग कर सकते हैं। आपको एक ऐतिहासिक टाइमज़ोन डीबी की आवश्यकता है जैसे कि pytz
मॉड्यूल द्वारा स्थानीय समय को पोसिक्स टाइमस्टैम्प में बदलने के लिए (जब तक कि ओएस पहले से ही इस तरह के डीबी प्रदान नहीं करता है) की जरूरत है
time.mktime(ts.timetuple())
जहां ts अजगर की
mktime/timetuple
। इसके अलावा timetuple()
एक सेकंड के स्ट्रिप्स अंश और सवाल का बिंदु मिलिसकॉन्ड सटीक के साथ टाइमस्टैम्प प्राप्त करना है।
आप अंतरिक्ष और समय में यात्रा करने के लिए डेलोरियन का उपयोग कर सकते हैं!
import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
यह मेरा इसे करने का तरीका है:
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
मॉड्यूल के लिए पायथन 2.7 डॉक्स से सिफारिशेंtime
time
मॉड्यूल का उपयोग करता है , लेकिन ओपी ने datetime
मॉड्यूल के बारे में पूछा । 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()
केवल utc समय के साथ काम करता है। tm_isdst
इसलिए इसका उपयोग नहीं किया जाता है इसलिए आप utcnow.timetuple()
इसके बजाय उपयोग कर सकते हैं utcnow.utctimetuple()
। नोट: यहां पर प्रयोग naive_local_datetime.utctimetuple()
करना गलत होगा। यह utc करने के लिए स्थानीय समय का अनुवाद नहीं करता है। इसके अलावा timetuple()
परिणाम से एक दूसरे के स्ट्रिप्स अंशों को कॉल करें (चाहे यह आवेदन पर निर्भर करता है)। इसके अलावा सवाल * मिली * सेकंड के बारे में पूछता है, सेकंड्स में नहीं
utctimetuple()
एक दूसरे के स्ट्रिप्स अंश। गुणा करके 1000
उन्हें वापस नहीं मिलेगा।
>>> 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
[१] http://docs.python.org/2/library/datetime.html#datetime.date.timetuple
यहां आपके समय की वस्तु के सामान्यीकरण के साथ समाधान का एक और रूप है:
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
, हालांकि, आप प्राप्त करते हैं seconds_since_epoch
। इस उत्तर को आगे बढ़ाते हुए क्योंकि मुझे अभी मिलीसेकंड की परवाह नहीं है।
यहाँ एक फ़ंक्शन है जो मैंने उपरोक्त उत्तर के आधार पर बनाया है
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
आप दिए गए मान को इस तरह से लपेट सकते हैं: str (int (res)) दशमलव मान के बिना इसे वापस करने के लिए स्ट्रिंग के रूप में या केवल int (str के बिना) के रूप में उपयोग किया जा सकता है
गुप्त डिक्टाइम के लिए यह अन्य समाधान यूनिक्सटैम्पैम्पमिलिस के लिए है।
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;
}