পাইথনে আইএসও সময় (আইএসও 8601)


339

আমার একটা ফাইল আছে পাইথনে, আমি এটির তৈরির সময় নিতে চাই এবং এটি পূর্ব সময় অঞ্চল (ইটি) তে তৈরি হয়েছিল তা সংরক্ষণ করে এটি একটি আইএসও টাইম (আইএসও 8601) স্ট্রিংয়ে রূপান্তর করতে চাই ।

আমি কীভাবে ফাইলটির সিটিটাইম গ্রহণ করব এবং এটি একটি পূর্ববর্তী সময় অঞ্চলকে নির্দেশ করে এমন একটি আইএসও টাইম স্ট্রিংয়ে রূপান্তর করব (এবং প্রয়োজনে দিবালোকের সঞ্চয় সময় বিবেচনা করে)?



11
@ নিক- দরকারী লিঙ্ক, তবে একটি সদৃশ নয় - তিনি অন্যভাবে রূপান্তর করার বিষয়ে জিজ্ঞাসা করছেন।
ইয়ারিন

1
@ জোসেফ- আমি কেবল আরএফসি 3999-এর প্রতি এটি জিজ্ঞাসা করেছি - এটির জন্য কাজ করা উচিত - পাইথনে আরএফসি 3339 টাইমস্ট্যাম্প জেনারেট করুন
ইয়ারিন

উত্তর:


559

স্থানীয় আইএসও 8601:

import datetime
datetime.datetime.now().isoformat()
>>> 2020-03-20T14:28:23.382748

ইউটিসি থেকে আইএসও 8601:

import datetime
datetime.datetime.utcnow().isoformat()
>>> 2020-03-20T01:30:08.180856

মাইক্রোসেকেন্ড ছাড়াই আইএসও 8601 এ স্থানীয়:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:30:43

টাইমজোন তথ্য (পাইথন 3) সহ ইউটিসি থেকে আইএসও 8601:

import datetime
datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()
>>> 2020-03-20T01:31:12.467113+00:00

মাইক্রোসেকেন্ড ছাড়াই স্থানীয় টাইমজোন সম্পর্কিত তথ্য সহ ইউটিসি 8601 থেকে (পাইথন 3):

import datetime
datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:31:43+13:00

টাইমজোন তথ্য (পাইথন 3) সহ আইএসও 8601 এ স্থানীয়:

import datetime
datetime.datetime.now().astimezone().isoformat()
>>> 2020-03-20T14:32:16.458361+13:00

লক্ষ্য করুন যে astimezone()ইউটিসি সময় ব্যবহার করার সময় একটি বাগ রয়েছে । এটি একটি ভুল ফলাফল দেয়:

datetime.datetime.utcnow().astimezone().isoformat() #Incorrect result

পাইথন 2 এর জন্য, দেখুন এবং পাইটজ ব্যবহার করুন


17
.isoformat()একটি বিভাজক প্যারামিটার নিতে পারে, (আপনি যদি 'টি' .isoformat(' ')
বাদে

5
@ থারস্মমনার জেনে ভাল! তবে খেয়াল রাখুন যে বিভাজকটি পরিবর্তন করা আর আইএসও -8601 মেনে চলবে না ... যা কিছুটা বোধগম্য নয় (তদ্ব্যতীত, তারিখগুলি মুদ্রণের আরও ভাল উপায় আছে তবে এখানে প্রশ্নটি ছিল না)। আরএফসি
এস্তানি

4
আইএসও -8601 স্ট্যান্ডার্ডের অংশ হিসাবে স্থান অনুমোদিত। It is permitted to omit the 'T' character by mutual agreement.
রায়চি

4
@ রায়চি সর্বদা পারস্পরিক চুক্তির মাধ্যমে মান পরিবর্তন করার অনুমতি দেওয়া হয়েছে (যা বেশিরভাগ ক্ষেত্রে এই মানটি ভেঙে দেবে, তবে এটি পারস্পরিক চুক্তি না হলে কে যত্নশীল, তাই না?)। আমার 2 সি: ঠিক নেই, যেমন আছে তেমন ছেড়ে দিন।
ইস্তানি

14
এই উত্তরটি ভুল কারণ ডেটটাইম.ডেটটাইম.নো ()। আইসোফর্ম্যাট () স্থানীয় হিসাবে স্থানীয় লেবেল ছাড়াই একটি স্থানীয় আইএসও 8601 স্ট্রিং প্রদান করে। সঠিক কাজটি করার জন্য আইসফর্ম্যাট পেতে আপনার কাছে একটি ডেটটাইম.টাইমজোন থাকতে হবে time
স্যাম হার্টম্যান

66

আমি এক্সএসডি ডেটটাইম ফর্ম্যাটে রূপান্তর করতে যা ব্যবহার করি তা এখানে:

from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your ISO string

এক্সএসডি তারিখের সময় ফর্ম্যাটটি ( xs:dateTime) খুঁজতে গিয়ে আমি এই প্রশ্নটি জুড়ে এসেছি । আমার থেকে মাইক্রোসেকেন্ডগুলি অপসারণ করা দরকার isoformat


4
"এক্সএসডি" কী (এই প্রসঙ্গে)?
পিটার মর্টেনসেন

1
আমি বিশ্বাস করি তিনি xs:dateএক্সএসডি / এক্সএমএল স্টাইলশিট থেকে বোঝাচ্ছেন।
সোভেন্তেচি

1
এর অর্থxs:dateTime
রাডটেক

56

আইএসও 8601 সময়ের প্রতিনিধিত্ব

আন্তর্জাতিক মানের আইএসও 8601 তারিখ এবং সময়গুলির জন্য একটি স্ট্রিং প্রতিনিধিত্ব বর্ণনা করে। এই ফর্ম্যাটটির দুটি সহজ উদাহরণ

2010-12-16 17:22:15
20101216T172215

(যা উভয়ই 16 ডিসেম্বর 2010 এর জন্য দাঁড়িয়েছে), তবে ফর্ম্যাটটি উপ-দ্বিতীয় রেজোলিউশনের সময় এবং সময় অঞ্চল নির্দিষ্ট করার অনুমতি দেয়। এই ফর্ম্যাটটি অবশ্যই পাইথন-নির্দিষ্ট নয়, তবে পোর্টেবল ফর্ম্যাটে তারিখ এবং সময় সংরক্ষণের জন্য এটি ভাল। এই ফর্ম্যাট সম্পর্কে বিশদটি মার্কাস কুহান এন্ট্রিতে পাওয়া যাবে

আমি ফাইলগুলিতে সময় সঞ্চয় করতে এই ফর্ম্যাটটি ব্যবহার করার পরামর্শ দিচ্ছি।

এই উপস্থাপনায় বর্তমান সময় পাওয়ার একটি উপায় পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে টাইম মডিউল থেকে স্ট্রফটাইম ব্যবহার করা:

>>> from time import strftime
>>> strftime("%Y-%m-%d %H:%M:%S")
'2010-03-03 21:16:45'

আপনি ডেটটাইম ক্লাসের স্ট্রিমটাইম কনস্ট্রাক্টর ব্যবহার করতে পারেন:

>>> from datetime import datetime
>>> datetime.strptime("2010-06-04 21:08:12", "%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 6, 4, 21, 8, 12)

সর্বাধিক শক্তিশালী হ'ল এজেনিক্স এমএক্সডেটটাইম মডিউল:

>>> from mx.DateTime.ISO import ParseDateTimeUTC
>>> from datetime import datetime
>>> x = ParseDateTimeUTC("2010-06-04 21:08:12")
>>> datetime.fromtimestamp(x)
datetime.datetime(2010, 3, 6, 21, 8, 12)

তথ্যসূত্র


2
এটি "আরও মজবুত" কোন সংবেদনে?
স্টাফেন

তারিখ:2018-05-25
লাক্স্যাক্সস

ইউটিসিতে সংযুক্ত তারিখ এবং সময়:2018-05-25T12:16:14+00:00
25:55

2
ইউটিসিতে সংযুক্ত তারিখ এবং সময়:2018-05-25T12:16:14Z
25:55

ইউটিসিতে সংযুক্ত তারিখ এবং সময়:20180525T121614Z
25:55

49

আমি ডকুমেন্টেশনে ডেটটাইম.আইসফর্ম্যাটটি পেয়েছি । আপনি যা চান তা মনে হচ্ছে:

datetime.isoformat([sep])

Return a string representing the date and time in ISO 8601 format, YYYY-MM-DDTHH:MM:SS.mmmmmm or, if microsecond is 0, YYYY-MM-DDTHH:MM:SS

If utcoffset() does not return None, a 6-character string is appended, giving the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or, if microsecond is 0 YYYY-MM-DDTHH:MM:SS+HH:MM

The optional argument sep (default 'T') is a one-character separator, placed between the date and time portions of the result. For example,
>>>

>>> from datetime import tzinfo, timedelta, datetime
>>> class TZ(tzinfo):
...     def utcoffset(self, dt): return timedelta(minutes=-399)
...
>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'

30

আইএসও 8601 বাদে কোনও বিভাজনকারী সহ একটি কমপ্যাক্ট প্রতিনিধিত্বের অনুমতি দেয় T, তাই আমি দ্রুত টাইমস্ট্যাম্প স্ট্রিং পেতে এই ওয়ান-লাইনারটি ব্যবহার করতে চাই:

>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%S.%fZ")
'20180905T140903.591680Z'

আপনার যদি মাইক্রোসেকেন্ডগুলির প্রয়োজন না হয় তবে কেবল .%fঅংশটি ছেড়ে দিন :

>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")
'20180905T140903Z'

স্থানীয় সময়ের জন্য:

>>> datetime.datetime.now().strftime("%Y%m%dT%H%M%S")
'20180905T140903'

সম্পাদনা:

আরও কিছু পড়ার পরে, আমি আপনাকে বিরামচিহ্নগুলি ছেড়ে দেওয়ার পরামর্শ দিই R আরএফসি 3339 স্টাইলটি সুপারিশ করে কারণ যদি প্রতিটি বিরামচিহ্ন ব্যবহার করে তবে একাধিক আইএসও 8601 স্ট্রিংগুলির মতো তাদের বিরামচিহ্নগুলিতে গ্রুপগুলিতে বাছাই করার ঝুঁকি নেই। অনুগত স্ট্রিংয়ের জন্য একটি লাইনারটি হ'ল:

>>> datetime.datetime.now().strftime("%Y-%m-%dT%H:%M%SZ")
'2018-09-05T14:09:03Z'

3
মিলিসেকেন্ডের অঙ্কগুলি 3 এ সীমাবদ্ধ করার কোনও উপায় কি? অর্থাত আমার অন্যান্য জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন উত্পাদন করা হবে 2019-02-23T04:02:04.051Zসঙ্গেnew Date().toISOString()
মিরান্ডা

19

আইএসও 8601 সময় ফর্ম্যাট কোন সময় জোন নাম সংরক্ষণ করে না, শুধুমাত্র সংশ্লিষ্ট UTC অফসেট সংরক্ষিত হয়।

পাইথন 3-তে ইউটিসি অফসেট সংরক্ষণের সময় একটি ফাইল সিটিটাইম একটি আইএসও 8601 টাইম স্ট্রিংয়ে রূপান্তর করতে:

>>> import os
>>> from datetime import datetime, timezone
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, timezone.utc)
>>> dt.astimezone().isoformat()
'2015-11-27T00:29:06.839600-05:00'

কোডটি ধরে নিয়েছে যে আপনার স্থানীয় সময় অঞ্চলটি পূর্ব টাইম অঞ্চল (ইটি) এবং আপনার সিস্টেমটি প্রদত্ত পসিক্স টাইমস্ট্যাম্প ( ts) এর জন্য একটি সঠিক ইউটিসি অফসেট সরবরাহ করে , অর্থ্যাৎ পাইথন আপনার সিস্টেমে একটি historicalতিহাসিক টাইমজোন ডাটাবেসে অ্যাক্সেস পেয়েছে বা টাইম জোনে ছিল নির্দিষ্ট তারিখে একই নিয়ম।

আপনার যদি বহনযোগ্য সমাধানের প্রয়োজন হয়; tz ডাটাবেসে অ্যাক্সেস সরবরাহ করে এমন pytzমডিউলটি ব্যবহার করুন :

>>> import os
>>> from datetime import datetime
>>> import pytz  # pip install pytz
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, pytz.timezone('America/New_York'))
>>> dt.isoformat()
'2015-11-27T00:29:06.839600-05:00'

এক্ষেত্রে ফলাফলও একই রকম।

আপনার যদি টাইম জোনের নাম / সংক্ষেপণ / জোন আইডি প্রয়োজন হয় তবে এটি আলাদাভাবে সঞ্চয় করুন।

>>> dt.astimezone().strftime('%Y-%m-%d %H:%M:%S%z (%Z)')
'2015-11-27 00:29:06-0500 (EST)'

দ্রষ্টব্য: না, :ইউটিসি অফসেটে এবং ESTটাইমজোন সংক্ষেপে আইএসও 8601 টাইম ফর্ম্যাটের অংশ নয়। এটি অনন্য নয়।

একই লাইব্রেরির বিভিন্ন গ্রন্থাগার / বিভিন্ন সংস্করণ একই তারিখ / সময় অঞ্চল জন্য বিভিন্ন সময় অঞ্চল নিয়ম ব্যবহার করতে পারে। এটি যদি ভবিষ্যতের তারিখ হয় তবে নিয়মগুলি এখনও অজানা হতে পারে। অন্য কথায়, একই ইউটিসি সময়টি আপনি কোন নিয়ম ব্যবহার করেন তার উপর নির্ভর করে ভিন্ন স্থানীয় সময়ের সাথে সঙ্গতিপূর্ণ হতে পারে - আইএসও 8601 ফর্ম্যাটে একটি সময় সাশ্রয় করে ইউটিসি সময় এবং স্থানীয় সময়কে সংরক্ষণ করে যা আপনার প্ল্যাটফর্মের ব্যবহারের বর্তমান সময় অঞ্চল নিয়মের সাথে সামঞ্জস্য করে । আপনার যদি আলাদা নিয়ম থাকে তবে আপনার স্থানীয় সময়টিকে আলাদা প্ল্যাটফর্মে পুনরায় গণনা করতে হবে।


14

os.statফাইল তৈরির সময় এবং ফর্ম্যাট করার জন্য time.strftimeএবং এর সংমিশ্রণ পেতে আপনাকে ব্যবহার করতে হবে time.timezone:

>>> import time
>>> import os
>>> t = os.stat('C:/Path/To/File.txt').st_ctime
>>> t = time.localtime(t)
>>> formatted = time.strftime('%Y-%m-%d %H:%M:%S', t)
>>> tz = str.format('{0:+06.2f}', float(time.timezone) / 3600)
>>> final = formatted + tz
>>> 
>>> final
'2008-11-24 14:46:08-02.00'

দিবালোক সঞ্চয় সময় জন্য সময় অঞ্চল কি অ্যাকাউন্ট করে? দেখে মনে হচ্ছে tz একই রকম হবে দিবালোকের সঞ্চয় সময় বা না নির্বিশেষে।
জোসেফ তুরিয়ান

2
এটি বর্তমানে যা কার্যকর হবে অফসেট হবে। যদি ডিএসটি সক্রিয় থাকে তবে ডিএসটি না থাকলে এটির থেকে আলাদা অফসেট থাকবে।
সর্বোচ্চ শওয়াবকেহ

4

আমি ভুল হলে আমাকে সংশোধন করুন (আমি নই), তবে ইউটিসি থেকে অফসেট দিবালোকের সময় সাশ্রয় করে changes সুতরাং আপনার ব্যবহার করা উচিত

tz = str.format('{0:+06.2f}', float(time.altzone) / 3600)

আমি আরও বিশ্বাস করি যে সাইনটি আলাদা হওয়া উচিত:

tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600)

আমি ভুল হতে পারে, কিন্তু আমি মনে করি না।


2

আমি জারেকের সাথে একমত, এবং আমি আরও নোট করি যে আইএসও অফসেট বিভাজক চরিত্রটি একটি কোলন, সুতরাং আমি মনে করি চূড়ান্ত উত্তরটি হওয়া উচিত:

isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':')

2

এস্তানির দুর্দান্ত উত্তরে একটি সামান্য প্রকরণ যোগ করা

টাইমজোন এবং কোনও মাইক্রোসেকেন্ড তথ্য (পাইথন 3) সহ আইএসও 8601 এ স্থানীয় :

import datetime, time

utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
datetime.datetime.now().replace(microsecond=0, tzinfo=datetime.timezone(offset=utc_offset)).isoformat()

নমুনা আউটপুট:

'2019-11-06T12:12:06-08:00'

পরীক্ষিত যে এই আউটপুটটি জাভাস্ক্রিপ্ট Dateএবং সি # DateTime/ উভয় দ্বারা পার্স করা যায়DateTimeOffset


1

আমি এই ফাংশনটি বিকাশ করেছি:

def iso_8601_format(dt):
    """YYYY-MM-DDThh:mm:ssTZD (1997-07-16T19:20:30-03:00)"""

    if dt is None:
        return ""

    fmt_datetime = dt.strftime('%Y-%m-%dT%H:%M:%S')
    tz = dt.utcoffset()
    if tz is None:
        fmt_timezone = "+00:00"
    else:
        fmt_timezone = str.format('{0:+06.2f}', float(tz.total_seconds() / 3600))

    return fmt_datetime + fmt_timezone

-6
import datetime, time    
def convert_enddate_to_seconds(self, ts):
    """Takes ISO 8601 format(string) and converts into epoch time."""
     dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\
                datetime.timedelta(hours=int(ts[-5:-3]),
                minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
    seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
    return seconds 

>>> import datetime, time
>>> ts = '2012-09-30T15:31:50.262-08:00'
>>> dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
>>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
>>> seconds
1348990310.26
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.