2015-05-26 7 views
5

मैं निम्नलिखित स्ट्रिंग है:पाइथन टाइमस्टैम्प स्ट्रिंग को युग में कैसे परिवर्तित करें?

mytime = "2009-03-08T00:27:31.807Z" 

मैं इसे कैसे अजगर में इपोक परिवर्तित?

मैंने कोशिश की:

import time 
p = '%Y-%m-%dT%H:%M:%S' 
int(time.mktime(time.strptime(s, p))) 

लेकिन यह 31.807Z साथ काम नहीं करता।

+0

आपने% S का उपयोग '.807Z' जैसा कुछ कैसे किया? % S दशमलव संख्या – haifzhan

उत्तर

3

आप अपनी प्रारूप स्ट्रिंग से .%fZ अनुपलब्ध हैं।

p = '%Y-%m-%dT%H:%M:%S.%fZ' 

सही तरीका युग में बदलने के लिए datetime उपयोग करने के लिए है:

from datetime import datetime 

p = '%Y-%m-%dT%H:%M:%S.%fZ' 
mytime = "2009-03-08T00:27:31.807Z" 
epoch = datetime(1970, 1, 1) 
print((datetime.strptime(mytime, p) - epoch).total_seconds()) 

या कॉल पूर्णांक आप भिन्न उपेक्षा करना चाहते हैं।

+0

के रूप में दिखाता है यह तब तक ठीक काम करता है जब तक यह ज़ेड में समाप्त होता है: पी –

+1

@ जोरनबेस्ले। मेरे अनंत ज्ञान में मैंने भविष्यवाणी की कि यह हमेशा 'जेड' में समाप्त होगा, मुझे लगता है कि आप हमेशा 'Z' और rstrip ("Z") को अनदेखा कर सकते हैं –

+1

यूटीसी समय पर 'time.mktime()' का उपयोग न करें! – jfs

1

कोड:

import datetime 
epoch = datetime.datetime(1970, 1, 1) 

mytime = "2009-03-08T00:27:31.807Z" 
myformat = "%Y-%m-%dT%H:%M:%S.%fZ" 
mydt = datetime.datetime.strptime(mytime, myformat) 
val = (mydt - epoch).total_seconds() 

print(val) 
> 1236472051.81 
repr(val) 
> '1236472051.807' 

नोट्स:

  • जब time.strptime() का उपयोग कर, लौट आए time.struct_time उप दूसरा परिशुद्धता समर्थन नहीं करता।
  • %fformat माइक्रोसेकंड के लिए है। इसे पार्स करते समय पूर्ण 6 अंक नहीं होने चाहिए।
1

dateutil केवल पुस्तकालय मैं पाया है सही ढंग से संबंधित है कि समय क्षेत्र के साथ identitifier ऑफसेट (Z)

pip install python-dateutil 

तो

from dateutil.parser import parse as date_parse 
print date_parse("2009-03-08T00:27:31.807Z") 
#get timestamp 

import calendar 
dt = date_parse("2009-03-08T00:27:31.807Z") 
timestamp1 = calendar.timegm(dt.timetuple()) 
+1

शायद एक और मजबूत समाधान। –

+0

@ पैड्राइक कनिंघम: यदि आप गलत प्रारूप का उपयोग करने वाले टाइमस्टैम्प को अस्वीकार करना चाहते हैं तो यह कम मजबूत है। 'डेट्यूटिल 'बहुत अधिक स्वीकार कर सकता है। – jfs

+0

इसके लिए 'डेट्यूटिल' का उपयोग करने के लिए यह एक ओवरकिल है। आप पाइथन 2 और 3 दोनों में केवल stdlib का उपयोग करके समय स्ट्रिंग को पार्स कर सकते हैं। यदि आप एक सेकंड के अंशों की परवाह नहीं करते हैं तो 'timegm()' ठीक है। – jfs

12

है दो भागों हैं:

  1. समय स्ट्रिंग को टूटा हुआ समय में कनवर्ट करें। How to parse ISO formatted date in python?
  2. Convert the UTC time to "seconds since the Epoch" (POSIX timestamp) देखें।
#!/usr/bin/env python 
from datetime import datetime 

utc_time = datetime.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ") 
epoch_time = (utc_time - datetime(1970, 1, 1)).total_seconds() 
# -> 1236472051.807 

आप यकीन है कि आप एक दूसरे के भिन्न अनदेखी करने के लिए और एक पूर्णांक परिणाम प्राप्त करना चाहते हैं, तो:

#!/usr/bin/env python 
import time 
from calendar import timegm 

utc_time = time.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ") 
epoch_time = timegm(utc_time) 
# -> 1236472051 

टाइमस्टैम्प का लीप सेकंड के अनुरूप समर्थन करने के लिए इस तरह के रूप Wed July 1 2:59:60 MSK 2015 , आप use a combination of time.strptime() and datetime (if you care about leap seconds you should take into account the microseconds too) कर सकते हैं।

+0

क्या होगा यदि आपको "200 9-03-08T00: 27: 31.807A" या ज़ुलू समय से कोई ऑफसेट मिलता है? लेकिन लोकेल जागरूक समय रूपांतरण के लिए +1 :) –

+0

@ जोरनबेस्ले यह गलत है ए की अनुमति नहीं है – jfs

संबंधित मुद्दे