पाइथन में UTC टाइमस्टैम्प के लिए datetime.date परिवर्तित करना


295

मैं अजगर में तारीखों के साथ काम कर रहा हूं और मुझे उन्हें जावास्क्रिप्ट के अंदर उपयोग करने के लिए उन्हें यूटीसी टाइमस्टैम्प में बदलना होगा। निम्नलिखित कोड काम नहीं करता है:

>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)

डेट ऑब्जेक्ट को पहले डेटटाइम पर कनवर्ट करने से भी मदद नहीं मिलती है। मैंने इस लिंक से उदाहरण की कोशिश की , लेकिन:

from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)

और अब या तो:

mktime(utc.localize(input_date).utctimetuple())

या

mktime(timezone('US/Eastern').localize(input_date).utctimetuple())

काम करेगा।

तो सामान्य प्रश्न: मैं यूटीसी के अनुसार युग के बाद से सेकंड में परिवर्तित तारीख कैसे प्राप्त कर सकता हूं?



29
मुझे यकीन नहीं है कि मैं इसे एक डुप्लिकेट के रूप में चिह्नित करने से सहमत हूं। जबकि समाधान समान हैं प्रश्न नहीं हैं। एक (यह) एक से टाइमस्टैम्प बनाने का प्रयास कर रहा है datetime.date, दूसरा एक स्ट्रिंग प्रतिनिधित्व को एक टाइमज़ोन से दूसरे में बदलने का प्रयास कर रहा है। जैसा कि कोई इस समस्या के समाधान की तलाश में है, मैं यह निष्कर्ष नहीं निकाल सकता कि उत्तरार्द्ध मुझे वह उत्तर प्रदान करेगा जिसकी मुझे तलाश है।
DRH

5
डेटाइम (तारीख, वर्ष, तारीख। माह, तारीख) .timestamp ()
जूलियन

जवाबों:


462

यदि d = date(2011, 1, 1)UTC में है:

>>> from datetime import datetime, date
>>> import calendar
>>> timestamp1 = calendar.timegm(d.timetuple())
>>> datetime.utcfromtimestamp(timestamp1)
datetime.datetime(2011, 1, 1, 0, 0)

यदि dस्थानीय समय क्षेत्र में है:

>>> import time
>>> timestamp2 = time.mktime(d.timetuple()) # DO NOT USE IT WITH UTC DATE
>>> datetime.fromtimestamp(timestamp2)
datetime.datetime(2011, 1, 1, 0, 0)

timestamp1और timestamp2भिन्न हो सकता है यदि UTC में मध्यरात्रि के रूप में स्थानीय समयक्षेत्र में मध्यरात्रि समान समय उदाहरण नहीं है।

mktime()यदि dकोई अस्पष्ट स्थानीय समय (जैसे, डीएसटी संक्रमण के दौरान) से मेल खाता है या dएक अतीत (भविष्य) की तारीख है, जब utc ऑफसेट अलग हो सकता है और C दिए गए प्लेटफॉर्म पर tz डेटाबेसmktime() तक कोई पहुंच नहीं है , तो एक गलत परिणाम दे सकता है । आप हो सकता है का उपयोग (जैसे के माध्यम से मॉड्यूल ) सभी प्लेटफार्मों पर TZ डेटाबेस तक पहुँच प्राप्त करने । इसके अलावा, विफल हो सकता है और समय-समय पर उपयोग किए जाने पर गैर-पॉसिक्स टाइमस्टैम्प वापस कर सकता हैpytztzlocal.get_localzone()utcfromtimestamp()mktime()"right"


datetime.dateबिना यूटीसी में तारीख का प्रतिनिधित्व करने वाली वस्तु को परिवर्तित करने के लिए calendar.timegm():

DAY = 24*60*60 # POSIX day in seconds (exact value)
timestamp = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * DAY
timestamp = (utc_date - date(1970, 1, 1)).days * DAY

मैं यूटीसी के अनुसार युग के बाद से सेकंड में परिवर्तित तिथि कैसे प्राप्त कर सकता हूं?

परिवर्तित करने के लिए datetime.datetime(नहीं datetime.date) ऑब्जेक्ट जो पहले से ही UTC में संबंधित POSIX टाइमस्टैम्प (a float) में समय का प्रतिनिधित्व करता है ।

पायथन 3.3+

datetime.timestamp():

from datetime import timezone

timestamp = dt.replace(tzinfo=timezone.utc).timestamp()

नोट: यह timezone.utcस्पष्ट रूप से आपूर्ति करने के लिए आवश्यक है अन्यथा .timestamp()मान लें कि आपकी भोली डेटाइम वस्तु स्थानीय समय क्षेत्र में है।

अजगर 3 (<3.3)

के लिए डॉक्स से datetime.utcfromtimestamp():

किसी टाइमस्टैम्प को डेटाइम उदाहरण से प्राप्त करने के लिए कोई विधि नहीं है, लेकिन डेटाइम उदाहरण के अनुरूप POSIX टाइमस्टैम्प की गणना आसानी से निम्न प्रकार से की जा सकती है। एक भोली के लिए:

timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

और एक जागरूक डीटी के लिए:

timestamp = (dt - datetime(1970,1,1, tzinfo=timezone.utc)) / timedelta(seconds=1)

दिलचस्प पढ़ें: युग का समय बनाम दिन का समय क्या समय के बीच अंतर है? और कितने सेकंड बीत चुके हैं?

यह भी देखें: डेटाइम को "युग" विधि की आवश्यकता है

अजगर २

पायथन 2 के लिए उपरोक्त कोड को अनुकूलित करने के लिए:

timestamp = (dt - datetime(1970, 1, 1)).total_seconds()

जहां सक्षम सच विभाजन के साथ गणना के timedelta.total_seconds()बराबर है (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

उदाहरण

from __future__ import division
from datetime import datetime, timedelta

def totimestamp(dt, epoch=datetime(1970,1,1)):
    td = dt - epoch
    # return td.total_seconds()
    return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6 

now = datetime.utcnow()
print now
print totimestamp(now)

फ्लोटिंग-पॉइंट मुद्दों से सावधान रहें ।

उत्पादन

2012-01-08 15:34:10.022403
1326036850.02

datetimePOSIX टाइमस्टैम्प के लिए एक जागरूक वस्तु कैसे परिवर्तित करें

assert dt.tzinfo is not None and dt.utcoffset() is not None
timestamp = dt.timestamp() # Python 3.3+

पायथन 3 पर:

from datetime import datetime, timedelta, timezone

epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
timestamp = (dt - epoch) / timedelta(seconds=1)
integer_timestamp = (dt - epoch) // timedelta(seconds=1)

पायथन 2 पर:

# utc time = local time              - utc offset
utc_naive  = dt.replace(tzinfo=None) - dt.utcoffset()
timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()

2
अजगर 2 मामले के लिए, क्यों नहीं timestamp = (dt - datetime.fromtimestamp(0)).total_seconds():?
m01

7
@ m01: datetime(1970, 1, 1)अधिक स्पष्ट है। fromtimestamp()यहाँ गलत है ( dtयूटीसी में है इसलिए utcfromtimestamp()इसका उपयोग किया जाना चाहिए)।
jfs

1
@fedorqui totimestamp()जवाब में फ़ंक्शन को देखें।
10

14
जितना मैं अजगर से प्यार करता हूं, उसकी तारीख-समय की गंभीरता गंभीर रूप से टूट गई है।
Realfun

3
@ रेलेफ़न: टाइमज़ोन, डीएसटी ट्रांज़िशन, टीज़ डेटाबेस, लीप सेकंड्स पायथन से स्वतंत्र होते हैं।
jfs

81

के लिये केवल यूनिक्स प्रणालियों के :

>>> import datetime
>>> d = datetime.date(2011,01,01)
>>> d.strftime("%s")  # <-- THIS IS THE CODE YOU WANT
'1293832800'

नोट 1: चक्कर आना यह देखा कि यह स्थानीयकृत टाइमज़ोन पर लागू होता है । उत्पादन में उपयोग न करें।

नोट 2: जकूब नारबस्की ने कहा कि यह ऑफ़सेट-अवगत डेटाटाइम (पायथन 2.7 के लिए परीक्षण) के लिए भी समय क्षेत्र की जानकारी को अनदेखा करता है


4
एक अच्छा जवाब यदि आप जानते हैं कि आपका कोड किस सिस्टम के तहत चलेगा, लेकिन यह ध्यान रखना महत्वपूर्ण है कि सभी ओएस पर '% s' प्रारूप स्ट्रिंग मौजूद नहीं है, इसलिए यह कोड पोर्टेबल नहीं है। यदि आप यह जाँचना चाहते हैं कि क्या यह समर्थित है तो आप man strftimeयूनिक्स जैसी प्रणालियों पर जाँच कर सकते हैं।
ऐलिस हेटन

5
यह उल्लेख किया जाना चाहिए कि यह भिन्नात्मक सेकंड भाग (माइक्रोसेकंड या जो भी) को गिराता है।
एल्फ

11
चेतावनी: यह स्थानीय समय-समय पर लागू होता है! आप मशीन समय के आधार पर समान
डेटाइम

3
इसके अलावा यह समय क्षेत्र की जानकारी को नजरअंदाज करता है और मानता है कि डेटाटाइम, स्थानीय समय क्षेत्र में भी ऑफसेट-अवगत डेटाटाइम के लिए है, जिसमें tzinfo सेट है। कम से कम, पायथन 2.7 में।
जकुब नारबस्की

1
जावास्क्रिप्ट टाइमस्टैम्प = अजगर टाइमस्टैम्प * 1000
ट्रिनह होआंग नू

38
  • मान लें 1: आप किसी तिथि को टाइमस्टैम्प में बदलने का प्रयास कर रहे हैं, हालाँकि जब से एक तिथि 24 घंटे की अवधि को कवर करती है, तब कोई एकल टाइमस्टैम्प नहीं होता है जो उस तिथि का प्रतिनिधित्व करता है। मुझे लगता है कि आप आधी रात को उस तिथि के टाइमस्टैम्प का प्रतिनिधित्व करना चाहते हैं (00: 00: 00.000)।

  • अनुमान 2: आपके द्वारा प्रस्तुत दिनांक किसी विशेष समय क्षेत्र से संबद्ध नहीं है, हालाँकि आप किसी विशेष समय क्षेत्र (UTC) से ऑफ़सेट निर्धारित करना चाहते हैं। दिनांक ज़ोन में समय क्षेत्र को जाने बिना, किसी विशिष्ट समय क्षेत्र के लिए टाइमस्टैम्प की गणना करना संभव नहीं है। मुझे लगता है कि आप तारीख का इलाज करना चाहते हैं जैसे कि यह स्थानीय प्रणाली समय क्षेत्र में है।

सबसे पहले, आप timetuple()सदस्य का उपयोग करते हुए विभिन्न समय घटकों का प्रतिनिधित्व करते हुए दिनांक उदाहरण को टपल में बदल सकते हैं :

dtt = d.timetuple() # time.struct_time(tm_year=2011, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=-1)

तब आप इसका उपयोग करके टाइमस्टैम्प में बदल सकते हैं time.mktime:

ts = time.mktime(dtt) # 1293868800.0

आप इस विधि को युगांतर के समय (1970-01-01) के साथ परीक्षण करके सत्यापित कर सकते हैं, जिस स्थिति में फ़ंक्शन को उस समय के स्थानीय समय क्षेत्र के लिए टाइमज़ोन ऑफसेट वापस करना चाहिए:

d = datetime.date(1970,1,1)
dtt = d.timetuple() # time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=-1)
ts = time.mktime(dtt) # 28800.0

28800.0 8 घंटे है, जो प्रशांत समय क्षेत्र (जहां मैं हूं) के लिए सही होगा।


मुझे यकीन नहीं है कि इसे क्यों घटाया गया है। यह ओपी के मुद्दे को संबोधित करता है (कार्य कोड ओपी को "काम नहीं करने वाला" कहा जाता है)। यह मेरे प्रश्न का उत्तर नहीं देता है ( UTC datetime.datetime को टाइमस्टैम्प में रूपांतरित करें ), लेकिन फिर भी ... upvoting।
थानाटोस

9
सावधान रहे। यह धारणा कि "आप तारीख का इलाज करना चाहते हैं जैसे कि यह स्थानीय प्रणाली टाइमज़ोन में है, अजगर में टाइमज़ोन के साथ सभी मुद्दों की जड़ है। जब तक आप मशीन के स्थानीयकरण से 100% सुनिश्चित नहीं होते हैं जो आपकी स्क्रिप्ट और विशेष रूप से चलेगा। अगर दुनिया में कहीं से भी ग्राहक आ सकते हैं, तो ALWAYS मान लें कि UTC में तारीखें हैं, और जितनी जल्दी हो सके रूपांतरण करें। यह आपके सिर पर बाल रखेगा, मुझ पर भरोसा करें।
रोमेन जी।

8

python2.7 दस्तावेज़ का पालन करें, आपको time.mktime () के बजाय Calendar.timegm () का उपयोग करना होगा

>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(calendar.timegm(d.timetuple()))
datetime.datetime(2011, 1, 1, 0, 0)

3
यदि यह UTC में है तो यह मेरे उत्तर से कैसे भिन्न है d?
JFS

8

मैंने अपने दो कार्यों को परिभाषित किया

  • utc_time2datetime (utc_time, tz = कोई नहीं)
  • datetime2utc_time (दिनांक)

यहाँ:

import time
import datetime
from pytz import timezone
import calendar
import pytz


def utc_time2datetime(utc_time, tz=None):
    # convert utc time to utc datetime
    utc_datetime = datetime.datetime.fromtimestamp(utc_time)

    # add time zone to utc datetime
    if tz is None:
        tz_datetime = utc_datetime.astimezone(timezone('utc'))
    else:
        tz_datetime = utc_datetime.astimezone(tz)

    return tz_datetime


def datetime2utc_time(datetime):
    # add utc time zone if no time zone is set
    if datetime.tzinfo is None:
        datetime = datetime.replace(tzinfo=timezone('utc'))

    # convert to utc time zone from whatever time zone the datetime is set to
    utc_datetime = datetime.astimezone(timezone('utc')).replace(tzinfo=None)

    # create a time tuple from datetime
    utc_timetuple = utc_datetime.timetuple()

    # create a time element from the tuple an add microseconds
    utc_time = calendar.timegm(utc_timetuple) + datetime.microsecond / 1E6

    return utc_time

1
मैंने आपके उदाहरण से सीधे अतीत को दूर कर दिया .. इस तरह की एक सरल चीज़ के लिए गन्दा और जटिल है .. बिल्कुल भी नहीं।
गुस्सा 84

@ मय्यम: मैंने इसे थोड़ा साफ किया और टिप्पणी को जोड़ा। यदि आपके पास समय-समय पर डेटाटाइम में परिवर्तित करने के लिए एक बेहतर और अधिक सामान्य समाधान है और बैक ज़ोन सेट ज़ोन करने में सक्षम है - तो कृपया हमें बताएं। इसके अलावा मुझे पता है कि एक और अधिक जाने pythonic मेरे कोड का उदाहरण जैसा दिखाई देगा।
agittarius

3

सवाल थोड़ा उलझा हुआ है। टाइमस्टैम्प UTC नहीं हैं - वे एक यूनिक्स चीज़ हैं। दिनांक UTC हो सकता है? यह मानते हुए, और यदि आप पाइथन 3.2+ का उपयोग कर रहे हैं, तो सरल-तिथि यह तुच्छ बनाती है:

>>> SimpleDate(date(2011,1,1), tz='utc').timestamp
1293840000.0

यदि आपके पास वास्तव में वर्ष, महीना और दिन है तो आपको इसे बनाने की आवश्यकता नहीं है date:

>>> SimpleDate(2011,1,1, tz='utc').timestamp
1293840000.0

और यदि तारीख किसी अन्य समयक्षेत्र में है (यह मामला इसलिए है क्योंकि हम संबंधित समय के बिना आधी रात को मान रहे हैं ):

>>> SimpleDate(date(2011,1,1), tz='America/New_York').timestamp
1293858000.0

[सरल-तिथि के पीछे का विचार सभी अजगर की तारीख और समय के सामान को एक सुसंगत कक्षा में इकट्ठा करना है, ताकि आप कोई भी रूपांतरण कर सकें। इसलिए, उदाहरण के लिए, यह दूसरा रास्ता भी तय करेगा:

>>> SimpleDate(1293858000, tz='utc').date
datetime.date(2011, 1, 1)

]


SimpleDate(date(2011,1,1), tz='America/New_York')उठाता है NoTimezone, जबकि pytz.timezone('America/New_York')कोई अपवाद नहीं बढ़ाता ( simple-date==0.4.8, pytz==2014.7)।
jfs

मुझे एक त्रुटि मिलती है pip install simple-date, ऐसा लगता है कि यह केवल python3 / pip3 है।
NoBugs 6

3

तीर पैकेज का उपयोग करना :

>>> import arrow
>>> arrow.get(2010, 12, 31).timestamp
1293753600
>>> time.gmtime(1293753600)
time.struct_time(tm_year=2010, tm_mon=12, tm_mday=31, 
    tm_hour=0, tm_min=0, tm_sec=0, 
    tm_wday=4, tm_yday=365, tm_isdst=0)

नोट: arrowउपयोग dateutil और टाइमजोन हैंडलिंग से संबंधित कई वर्षों के बग के लिएdateutil जाना जाता है । यदि आप एक गैर-निश्चित यूटीसी ऑफसेट के साथ टाइमज़ोन के लिए सही परिणामों की आवश्यकता है, तो इसका उपयोग न करें (यूटीसी टाइमज़ोन के लिए इसका उपयोग करना ठीक है लेकिन स्टैडलिब यूटीसी मामले को ठीक भी संभालता है)।
jfs

@JFSebastian यह बग केवल एक संक्रमण के दौरान , अस्पष्ट समय में होता है।
पॉल

लगता है कि बग 28 मार्च को तय किया गया था
मैथ्यू लॉन्गटिन

लगता है, जैसे यह सबसे अच्छा और क्रॉस-पायथन समाधान है। बस तीर का उपयोग करें । धन्यवाद;)
मैक्सकोरुकोव

@ मैथियुलोंगतिन डेटटाइल में अन्य मुद्दे
jfs

1

एक पूर्ण समय-स्ट्रिंग में शामिल हैं:

  • तारीख
  • समय
  • UTCOFFSET [+HHMM or -HHMM]

उदाहरण के लिए:

1970-01-01 06:00:00 +0500 == 1970-01-01 01:00:00 +0000 == UNIX timestamp:3600

$ python3
>>> from datetime import datetime
>>> from calendar import timegm
>>> tm = '1970-01-01 06:00:00 +0500'
>>> fmt = '%Y-%m-%d %H:%M:%S %z'
>>> timegm(datetime.strptime(tm, fmt).utctimetuple())
3600

ध्यान दें:

UNIX timestampयूटीसी में, युग के बाद से सेकंड में व्यक्त किया गया एक फ्लोटिंग पॉइंट नंबर है ।


संपादित करें:

$ python3
>>> from datetime import datetime, timezone, timedelta
>>> from calendar import timegm
>>> dt = datetime(1970, 1, 1, 6, 0)
>>> tz = timezone(timedelta(hours=5))
>>> timegm(dt.replace(tzinfo=tz).utctimetuple())
3600

6
और यह मेरे सवाल का जवाब कैसे देता है?
एंड्रियास जंग

1
@ user908088 आपके द्वारा पूछे गए अनुसार कन्वर्ट 1970-01-01 06:00:00 +0500करें 3600
केव

1
@ user908088 वहाँ नहीं timezoneहै python2, आप मैन्युअल रूप से गणना ( 06:00:00- +0500= 01:00:00) कर सकते हैं ।
केव

5
शीर्ष पर इसका जवाब क्यों है, यहां तक ​​कि इसके पास -1 वोट भी हैं, जो SO
उमैर

1

आपके पास किसी datetimeऑब्जेक्ट को बुलाया जाना माना जाता है d, UTC में टाइमस्टैम्प प्राप्त करने के लिए निम्नलिखित का उपयोग करें:

d.strftime("%Y-%m-%dT%H:%M:%S.%fZ")

और विपरीत दिशा के लिए, निम्नलिखित का उपयोग करें:

d = datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%fZ")

0

मैं गहरी चर्चा से प्रभावित हूं।

मेरे 2 सेंट:

डेटाइम आयात से डेटाइम आयात समय

utc में टाइमस्टैम्प है:

timestamp = \
(datetime.utcnow() - datetime(1970,1,1)).total_seconds()

या,

timestamp = time.time()

यदि अब उसी DST में datetime.now () से परिणाम आता है

utcoffset = (datetime.now() - datetime.utcnow()).total_seconds()
timestamp = \
(now - datetime(1970,1,1)).total_seconds() - utcoffset
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.