मैं पायथन में युग (यूनिक्स समय) से मिलीसेकंड के लिए एक डेटाइम ऑब्जेक्ट को कैसे बदल सकता हूं?


356

मेरे पास एक पायथन datetimeऑब्जेक्ट है जिसे मैं 1970 के युग से यूनिक्स समय, या सेकंड / मिलीसेकंड में बदलना चाहता हूं।

मैं यह कैसे करु?



यदि आप यहां मिलीसेकंड परिशुद्धता के साथ बस वर्तमान युग के सेकंड चाहते हैं , तो कोशिश करें $ python -c 'import time; print(time.time())'जो दिया गया है:1584487455.698623
MarkHu

जवाबों:


474

यह मुझे प्रतीत होता है कि ऐसा करने का सबसे सरल तरीका है

import datetime

epoch = datetime.datetime.utcfromtimestamp(0)

def unix_time_millis(dt):
    return (dt - epoch).total_seconds() * 1000.0

32
अब तक यह सबसे अच्छा समाधान है (यदि अजगर संस्करण> 2.7)। क्योंकि %sओएस कार्यान्वयन निर्भर है! इस प्रकार कोई भी चाहता है कि कोड जिस पर चाहे OS काम करे, उसे कभी भी उपयोग नहीं करना चाहिए %s। 2.3 <py ver <2.7 के लिए। एक बस total_seconds()इस तरह का निर्माण कर सकता है :delta.days*86400+delta.seconds+delta.microseconds/1e6
वांग

14
नोट: dtUTC में होना चाहिए (स्थानीय नहीं)। देखें 2.6 / 3 समर्थन अजगर के साथ इसी तरह जवाब
JFS

7
वर्थ उल्लेख है कि अगर सभी आप चाहते हैं एक सच्चे यूनिक्स टाइमस्टैम्प के रूप में यहाँ परिभाषित किया गया है en.wikipedia.org/wiki/Unix_time (और इसलिए केवल इस उत्तर से unix_time समारोह का उपयोग किया जाएगा) तो आप delta.total_seconds () पूर्णांक के साथ करने के लिए लपेट चाहिए एक फ्लोट के साथ समाप्त होने से बचें
corford

1
युग गणना का उपयोग कर utcfromtimestamp(0)एक 'TZ' ऑफसेट केवल 'TZ' का कारण हो सकता 0. नहीं है इसका कारण यह है dt में dt- epochहै 'TZ' उस में गणना की जहां युग के रूप में UTC समय है। युग की गणना करने का सबसे अच्छा तरीका वह है epoch = datetime.datetime(1970, 1, 1)जहां टाइमजोन विचार में है।
आहज

35
क्यों ओह datetime.utcfromtimestamp(0)tzinfo के बिना एक डेटाइम वापस क्यों करता है ? यह विधि नाम में वहीं है , यूटीटीमेस्टैम्प। इसे गैर-भोला बनाने के लिए मुझे कुछ ऐसा करना होगा datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)। यह आवश्यक है यदि dtTypeError: can't subtract offset-naive and offset-aware datetimes
टाइमजोन

171

पायथन 3.3 में, नई विधि जोड़ी गई timestamp:

import datetime
seconds_since_epoch = datetime.datetime.now().timestamp()

आपके प्रश्न में कहा गया है कि आपको मिलीसेकंड की आवश्यकता है, जिसे आप इस तरह प्राप्त कर सकते हैं:

milliseconds_since_epoch = datetime.datetime.now().timestamp() * 1000

यदि आप timestampएक भोली डेटाइम ऑब्जेक्ट पर उपयोग करते हैं, तो यह माना जाता है कि यह स्थानीय समय क्षेत्र में है। यदि आप ऐसा करने का इरादा नहीं रखते हैं, तो टाइमजोन-अवगत डेटाटाइम ऑब्जेक्ट का उपयोग करें।


28
नोट: .timestamp()विधि मानती है कि एक भोली इनपुट डेटाइम स्थानीय समय क्षेत्र में है (और स्थानीय समय अस्पष्ट हो सकता है)। यदि यह यूटीसी में है तो dt.replace(tzinfo=timezone.utc).timestamp()इसके बजाय उपयोग करें ।
jfs

11
datetime.timestamp () एक फ्लोट के रूप में युगीन सेकंड देता है।
मील का पत्थर

9
यह उत्तर कॉपी-एंड-पास्टेबल उदाहरण नहीं है, जो docs.python.org/3/library/… पर अन-ह्यूमन-फ्रेंडली डॉक्स की भावना में है:datetime.datetime.timestamp(datetime.datetime.now())
MarkHu

3
3.6 में (कम से कम), datetime.timestamp () एक टाइमजोन भोले (tzinfo = कोई नहीं) मानती है कि UTC में डेटाटाइम है। तो हमेशा अपना समय-क्षेत्र सेट करने के लिए बेहतर है: datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()लेकिन (हमेशा) बराबर नहीं datetime.datetime.now().timestamp()(यह अंतिम केवल बाकी के बराबर है अगर स्थानीय tz UTC है ...)
Bluu

1
आपकी रुचि के लिए, रिवर्स]] है fromtimestamp( docs.python.org/3/library/… )
फ्लिम

98
>>> 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

प्रलेखन:


6
Btw, strftime ("% s") मेरे लिए एक खाली स्ट्रिंग लौटाता है। दूसरा तरीका ठीक काम करता है।
पावेल वलसोव

23
केवल दूसरी सटीकता है
shuckc

6
'% s' पायथन उदाहरण के लिए समर्थित नहीं है, यह विंडोज पर अनुपस्थित हो सकता है। .timetuple()रिटर्न tm_isdst=-1यह बलों mktime()का अनुमान लगाना। यह डीएसटी के दौरान गलत अनुमान लगा सकता है (त्रुटि का 50% मौका +/- घंटा)। दोनों '% s' और mktime()अतीत से तारीखों के लिए गलत utc ऑफसेट का उपयोग कर सकते हैं। आपको एक ऐतिहासिक टाइमज़ोन डीबी की आवश्यकता है जैसे कि pytzमॉड्यूल द्वारा स्थानीय समय को पोसिक्स टाइमस्टैम्प में बदलने के लिए (जब तक कि ओएस पहले से ही इस तरह के डीबी प्रदान नहीं करता है) की जरूरत है
19:14

1
time.mktime(ts.timetuple())जहां ts अजगर की
डेटाइम

1
@ सुहैल: ऊपर मेरी टिप्पणी पढ़ें mktime/timetuple। इसके अलावा timetuple()एक सेकंड के स्ट्रिप्स अंश और सवाल का बिंदु मिलिसकॉन्ड सटीक के साथ टाइमस्टैम्प प्राप्त करना है।
jfs


13

यह मेरा इसे करने का तरीका है:

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
@JFSebastian सिर के लिए धन्यवाद! वास्तव में वहाँ कोई विचार नहीं किया जा रहा है। यदि आपका सर्वर UTC के बजाय स्थानीय समय में है तो इससे फर्क पड़ेगा। मुझे UTC के अलावा किसी अन्य चीज़ में सर्वर सेट करने का कोई आकर्षक कारण नहीं मिला (अभी तक)। मेरी मोटो "यूटीसी लिखो, स्थानीय-समय पढ़ो" है, इसलिए आप हमेशा जानते हैं कि आप कहाँ रह रहे हैं ...
एस्टानी

2
आप हमेशा समय-सारणी का अनुमान लगाने की कोशिश कर रहे mktime के मुद्दे से बचने के लिए mktime के बजाय Calendar.timegm का उपयोग कर सकते हैं।
डेको

13

@ChristopherBull सेकंड पाने के लिए मिलीसेकंड की संख्या को 1000 से विभाजित करें
जोनास

5
आपने गलत समझा और इसे गलत तरीके से घेर लिया। उपरोक्त कार्यों में सेकंड्स सभी उपलब्ध हैं। आप इसे मिलीसेकंड में परिवर्तित कर सकते हैं, लेकिन यह एक सेकंड की सटीकता होगी।
क्रिस्टोफर बुल

1
यह उत्तर timeमॉड्यूल का उपयोग करता है , लेकिन ओपी ने datetimeमॉड्यूल के बारे में पूछा । int(time.time())
एफडब्ल्यूआईडब्ल्यू

7
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()परिणाम से एक दूसरे के स्ट्रिप्स अंशों को कॉल करें (चाहे यह आवेदन पर निर्भर करता है)। इसके अलावा सवाल * मिली * सेकंड के बारे में पूछता है, सेकंड्स में नहीं
jfs

मैं कोड को बिल्कुल स्पष्ट करने के लिए utcnow () और utctimetuple () का उपयोग करना पसंद करता हूं जो आप UTC के साथ काम कर रहे हैं (और इस तरह से इसे पढ़ने वाले किसी व्यक्ति को यह याद रखने की आवश्यकता नहीं है कि यह UTC केवल है)। utctimetuple () एक भोली dttm वस्तु पर अनुवाद का मतलब नहीं है (इसलिए utcnow () के साथ dttm initing)। इसके अलावा, प्रश्न सेकंड या मिलीसेकंड का उल्लेख किया गया है।
कॉर्डफोर्ड

नोट: अंतिम टिप्पणी में कहा जाना चाहिए कि मैंने प्रश्न पढ़ा था कि वह सेकंड या मिलीसेकंड (शायद मेरी गलती) चाहता था। मिलिस के लिए सिर्फ 1000 से गुणा करें (जैसा कि शीर्ष स्कोरिंग उत्तर बताता है)।
कोरफोर्ड

utctimetuple()एक दूसरे के स्ट्रिप्स अंश। गुणा करके 1000उन्हें वापस नहीं मिलेगा।
jfs

1
जिस तरह से ओपी ने यह सवाल पूछा, वह बिल्कुल स्पष्ट नहीं है कि वह क्या चाहता था (यानी एक सच्चा यूनिक्स टाइमस्टैम्प या मिलीसेकंड सटीकता के साथ टाइमस्टैम्प)। बावजूद, दोनों प्रश्न पहले से ही कहीं और पूछे गए हैं और उत्तर दिए गए हैं। यह कहने के बाद, मुझे लगता है कि यहाँ जवाब लोगों के लिए सबसे तेजी से और सबसे साफ हैं और समस्या के विभिन्न समाधानों को दर्शाने का अच्छा काम करते हैं।
corford

3
>>> 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

[२] http://docs.python.org/2/library/time.html


3

यहां आपके समय की वस्तु के सामान्यीकरण के साथ समाधान का एक और रूप है:

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

2

पंडों का एक सा कोड:

import pandas

def to_millis(dt):
    return int(pandas.to_datetime(dt).value / 1000000)

1
import time
seconds_since_epoch = time.mktime(your_datetime.timetuple()) * 1000

9
ये गलत है! समय-सारणी में मिलीसेकंड शामिल नहीं है, इस प्रकार mktime मिलिसेकंड संकल्प के साथ युग को वापस नहीं करेगा। इस मामले में यह बेकार है।
वांग

@Wang - आप सही हैं सर, यह वापस नहीं आती है मिलिस, केवल सेकंड
मैटो टॉड


1
यदि आप हटाते हैं * 1000, हालांकि, आप प्राप्त करते हैं seconds_since_epoch। इस उत्तर को आगे बढ़ाते हुए क्योंकि मुझे अभी मिलीसेकंड की परवाह नहीं है।
माइकल शेपर

0

यहाँ एक फ़ंक्शन है जो मैंने उपरोक्त उत्तर के आधार पर बनाया है

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 के बिना) के रूप में उपयोग किया जा सकता है


-14

गुप्त डिक्टाइम के लिए यह अन्य समाधान यूनिक्सटैम्पैम्पमिलिस के लिए है।

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;
    } 

2
प्रश्न पायथन भाषा के बारे में है
स्टीफन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.