পাইথন ইউটিসি ডেটটাইম অবজেক্টের আইএসও ফর্ম্যাটে জেড (জুলু বা জিরো অফসেট) অন্তর্ভুক্ত নেই


120

পাইথন ২.7 জাভাস্ক্রিপ্টের বিপরীতে ইউটিসি ডেটটাইম অবজেক্টের আইসফর্ম্যাট স্ট্রিংয়ের শেষে জেড অক্ষর (জুলু বা শূন্য অফসেট) অন্তর্ভুক্ত করে না কেন?

>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'

যেখানে জাভাস্ক্রিপ্টে রয়েছে

>>>  console.log(new Date().toISOString()); 
2013-10-29T09:38:41.341Z

1
পাইথনের ডেটটাইম মানগুলির কোনও টাইমজোন তথ্য নেই। আপনি যদি নিজের টাইম স্ট্যাম্পে টাইমজোন তথ্য সঞ্চিত রাখতে চান তবে পাইটজ বা ব্যাবেল চেষ্টা করুন।
tnknepp

67
datetime.datetime.utcnow().isoformat() + 'Z'
jfs


3
..এবং অনুপস্থিত জেড আশ্চর্যজনক কিছু জিনিস না কাজ যেমন API কল ঘটায়
এলাচ

এটি আরও খারাপ হয়ে যায়,
ডেটটাইমের

উত্তর:


52

পাইথন datetimeঅবজেক্টের ডিফল্টরূপে টাইম জোন সম্পর্কিত তথ্য থাকে না এবং এটি ছাড়া পাইথন আসলে আইএসও 8601 স্পেসিফিকেশন লঙ্ঘন করে ( যদি কোনও টাইম জোনের তথ্য না দেওয়া হয় তবে স্থানীয় সময় হিসাবে ধরে নেওয়া হয় )। আপনি কিছু ডিফল্ট সময় অঞ্চল পেতে পাইটজ প্যাকেজটি ব্যবহার করতে পারেন , বা সরাসরি tzinfoনিজেকে সাবক্লাস করতে পারেন :

from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)

তারপরে আপনি ম্যানুয়ালি সময় জোনের তথ্য এতে যুক্ত করতে পারেন utcnow():

>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
'2014-05-16T22:51:53.015001+00:00'

নোট করুন যে এটি আইএসও 8601 ফর্ম্যাটের সাথে সামঞ্জস্য করে, যা ইউটিসির জন্য Zবা +00:00প্রত্যয় হিসাবে অনুমতি দেয় । নোট করুন যে পরবর্তী সময়গুলি সাধারণত জোনগুলিকে কীভাবে উপস্থাপন করা হয় তার সাথে (ইউটিসি একটি বিশেষ ক্ষেত্রে))


108
এর Zপরিবর্তে আমি কীভাবে অন্তর্ভুক্ত করব +00:00?
লিওপুডল

14
সতর্কতামূলক !!! pytzপাইথনের tzinfoপ্রোটোকল লঙ্ঘন এবং ব্যবহার করা বিপজ্জনক! দেখুন blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.html
ivan_pozdeev

@ivan_pozdeev লিঙ্কটির জন্য ধন্যবাদ, খুব আকর্ষণীয়। দ্রষ্টব্য যে dateutilপাইথন 3.6 পর্যন্ত পিইপি 495 সহ কাজ করার অনুমতি দেয় পরিবর্তনগুলি কার্যকর করা হয়নি, সুতরাং pytzইন্টারফেস পরিবর্তিত হওয়ার কারণে স্ট্যান্ডার্ড ইন্টারফেসটি ব্যবহার করা অন্যায় নয়। পরিবর্তনের আগে এটির কাজ করার একমাত্র উপায় ছিল pytzএটিই।
মার্ক র্যানসোম

67

অপশন: isoformat()

পাইথন এর datetimeসমর্থন করে না সামরিক অঞ্চল ইউটিসি জন্য 'জেড' প্রত্যয় মত প্রত্যয়। নিম্নলিখিত সহজ স্ট্রিং প্রতিস্থাপন কৌশলটি করে:

In [1]: import datetime

In [2]: d = datetime.datetime(2014, 12, 10, 12, 0, 0)

In [3]: str(d).replace('+00:00', 'Z')
Out[3]: '2014-12-10 12:00:00Z'

str(d) মূলত হিসাবে একই d.isoformat(sep=' ')

দেখুন: ডেটটাইম, পাইথন স্ট্যান্ডার্ড লাইব্রেরি

অপশন: strftime()

বা আপনি strftimeএকই প্রভাব অর্জন করতে ব্যবহার করতে পারেন :

In [4]: d.strftime('%Y-%m-%d %H:%M:%SZ')
Out[4]: '2014-12-10 12:00:00Z'

দ্রষ্টব্য: এই বিকল্পটি কেবল তখনই কাজ করবে যখন আপনি জানবেন যে নির্দিষ্ট তারিখটি ইউটিসিতে রয়েছে।

দেখুন: ডেটটাইম.স্ট্রিটাইম ()


অতিরিক্ত: হিউম্যান রিডেবল টাইমজোন

আরও এগিয়ে যেতে, আপনি টাইমজোন পতাকা pytzসহ মানব পাঠযোগ্য সময় অঞ্চল তথ্য প্রদর্শন করতে আগ্রহী হতে পারেন strftime %Z:

In [5]: import pytz

In [6]: d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=pytz.utc)

In [7]: d
Out[7]: datetime.datetime(2014, 12, 10, 12, 0, tzinfo=<UTC>)

In [8]: d.strftime('%Y-%m-%d %H:%M:%S %Z')
Out[8]: '2014-12-10 12:00:00 UTC'

1
Tফাঁকা পরিবর্তে বিভাজক হওয়া উচিত নয় ?
মার্সেলো রোমানি

1
এটি d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)2 লাইনে হওয়া উচিত । বিটিডব্লিউ ।, আরএফসি 3339 এ এটি বলে যে একটি স্থান 'ঠিক আছে' ('টি' এর পরিবর্তে)।
মিঃফুপ্পেস

16

নিম্নলিখিত জাভাস্ক্রিপ্ট এবং পাইথন স্ক্রিপ্টগুলি অভিন্ন আউটপুট দেয়। আমি মনে করি এটি আপনি যা খুঁজছেন

জাভাস্ক্রিপ্ট

new Date().toISOString()

পাইথন

import datetime

datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

তারা যে আউটপুট দেয় তা হ'ল utc (zelda) সময়টি একটি ISO স্ট্রিং হিসাবে 3 মিলিসেকেন্ডের উল্লেখযোগ্য অঙ্কের সাথে ফর্ম্যাট করা হয় এবং একটি জেডের সাথে যুক্ত হয় is

2019-01-19T23:20:25.459Z

12

পাইথন> = 3.2 এ আপনি কেবল এটি ব্যবহার করতে পারেন:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2019-03-14T07:55:36.979511+00:00'

3
খুব সুন্দর সমাধান। সম্পর্কে তাদের প্রশ্নের জন্য Z, আপনি অফসেটটি ক্লিপ করতে পারেন:.isoformat()[:-6] + 'Z'
ম্যাক্সিমিলিয়ান বার্সলে

11

পাইথনের ডেটটাইমস একটু চটকদার। ব্যবহার arrow

> str(arrow.utcnow())
'2014-05-17T01:18:47.944126+00:00'

তীরের মূলত ডেটটাইমের মতো একই এপিআই থাকে তবে টাইমজোন এবং কিছু অতিরিক্ত চমত্কার জিনিস যা মূল লাইব্রেরিতে থাকা উচিত।

জাভাস্ক্রিপ্টের সাথে সামঞ্জস্যপূর্ণ একটি ফর্ম্যাট এটি অর্জন করতে পারে:

arrow.utcnow().isoformat().replace("+00:00", "Z")
'2018-11-30T02:46:40.714281Z'

জাভাস্ক্রিপ্ট Date.parseচুপচাপ টাইমস্ট্যাম্প থেকে মাইক্রোসেকেন্ডগুলি নামিয়ে দেবে।


7
স্ট্রিংটি 'জেড' দিয়ে শেষ না হওয়ায় এটি প্রশ্নের উত্তর দেয় না।
ক্যালিসিন

3

পোস্টটিতে অনেক ভাল উত্তর রয়েছে তবে আমি জাভাস্ক্রিপ্টের সাথে ফর্ম্যাটটি ঠিক ঠিক মতো বেরিয়ে আসতে চাইছিল। এটি আমি ব্যবহার করছি এবং এটি ভালভাবে কাজ করে।

In [1]: import datetime

In [1]: now = datetime.datetime.utcnow()

In [1]: now.strftime('%Y-%m-%dT%H:%M:%S') + now.strftime('.%f')[:4] + 'Z'
Out[3]: '2018-10-16T13:18:34.856Z'

3
pip install python-dateutil
>>> a = "2019-06-27T02:14:49.443814497Z"
>>> dateutil.parser.parse(a)
datetime.datetime(2019, 6, 27, 2, 14, 49, 443814, tzinfo=tzutc())

2

আমি কয়েকটি লক্ষ্য নিয়ে এই সমস্যাটির কাছে পৌঁছেছি:

  • আইএসও 8601 ফর্ম্যাটে একটি ইউটিসি "সচেতন" ডেটটাইম স্ট্রিং উত্পন্ন করুন
  • ব্যবহার শুধুমাত্র DATETIME বস্তু এবং স্ট্রিং সৃষ্টির জন্য পাইথন স্ট্যান্ডার্ড লাইব্রেরী ফাংশন
  • জ্যাঙ্গো timezoneইউটিলিটি ফাংশন এবং dateutilপার্সার সহ ডেটটাইম অবজেক্ট এবং স্ট্রিংকে বৈধতা দিন
  • আইএসও 8601 ডেটটাইম স্ট্রিংটি ইউটিসি সচেতন তা যাচাই করতে জাভাস্ক্রিপ্ট ফাংশন ব্যবহার করুন

এই পদ্ধতির মধ্যে জেড প্রত্যয় অন্তর্ভুক্ত নয় এবং এটি ব্যবহার করে নাutcnow() , তবে এটি পাইথন ডকুমেন্টেশনের সুপারিশের ভিত্তিতে এবং এটি জ্যাঙ্গো এবং জাভাস্ক্রিপ্টের সাথে মাস্টারটি পাস করে।

এর datetime.now()পরিবর্তে একটি ইউটিসি টাইমজোন অবজেক্টটি ব্যবহার করে শুরু করা যাক datetime.utcnow():

from datetime import datetime, timezone

datetime.now(timezone.utc)
>>> datetime.datetime(2020, 1, 8, 6, 6, 24, 260810, tzinfo=datetime.timezone.utc)

datetime.now(timezone.utc).isoformat()
>>> '2020-01-08T06:07:04.492045+00:00'

এটি দেখতে দুর্দান্ত, তাই আসুন জ্যাঙ্গো কী dateutilভাবেন এবং কী ভাবেন:

from django.utils.timezone import is_aware

is_aware(datetime.now(timezone.utc))
>>> True

import dateutil.parser

is_aware(dateutil.parser.parse(datetime.now(timezone.utc).isoformat()))
>>> True

ঠিক আছে, পাইথন ডেটটাইম অবজেক্ট এবং আইএসও 8601 স্ট্রিংটি ইউটিসি "সচেতন"। এখন আসুন জাভাস্ক্রিপ্ট ডেটটাইম স্ট্রিং সম্পর্কে কী চিন্তা করে তা দেখুন। এই উত্তর থেকে ধার আমরা পেয়েছি:

let date= '2020-01-08T06:07:04.492045+00:00';
const dateParsed = new Date(Date.parse(date))

document.write(dateParsed);
document.write("\n");
// Tue Jan 07 2020 22:07:04 GMT-0800 (Pacific Standard Time)

document.write(dateParsed.toISOString());
document.write("\n");
// 2020-01-08T06:07:04.492Z

document.write(dateParsed.toUTCString());
document.write("\n");
// Wed, 08 Jan 2020 06:07:04 GMT

আপনি এই ব্লগ পোস্টটি পড়তে চাইতে পারেন ।


1
বেস লাইব্রেরির ফাংশনগুলিকে আঁকিয়ে রাখার জন্য এবং কোনও পুরানো পোস্টে অনুসরণ করার জন্য বোনাস।
ভিক্টর রোমিও

1

উপরের সমস্ত উত্তর একত্রিত করে আমি নিম্নলিখিত ফাংশন নিয়ে এসেছি:

from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)


def getdata(yy, mm, dd, h, m, s) :
    d = datetime(yy, mm, dd, h, m, s)
    d = d.replace(tzinfo=simple_utc()).isoformat()
    d = str(d).replace('+00:00', 'Z')
    return d


print getdata(2018, 02, 03, 15, 0, 14)

1

আমি দুল ব্যবহার করি:

import pendulum


d = pendulum.now("UTC").to_iso8601_string()
print(d)

>>> 2019-10-30T00:11:21.818265Z

0
>>> import arrow

>>> now = arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS')
>>> now
'2018-11-28T21:34:59.235'
>>> zulu = "{}Z".format(now)
>>> zulu
'2018-11-28T21:34:59.235Z'

বা, এটি একটি পেতে হতাশ:

>>> zulu = "{}Z".format(arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS'))
>>> zulu
'2018-11-28T21:54:49.639Z'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.