কেন ডেটটাইম.ডেটটাইম.টুকনো () এ টাইমজোন সম্পর্কিত তথ্য থাকে না?


285
datetime.datetime.utcnow()

কেন datetimeএটিতে কোনও টাইমজোন তথ্য দেওয়া হয়নি যে এটি স্পষ্টতই একটি ইউটিসি datetime?

আমি আশা করি এটিতে এটি থাকবে tzinfo


সাধারণ আইসো ফর্ম্যাট তারিখের ক্ষেত্রটি কীভাবে রূপান্তর করবেন যা টাইপ স্ট্রিংকে ইউটিসি ফর্ম্যাটে রূপান্তর করতে পারে?
নাভি

উত্তর:


192

এর অর্থ এটি টাইমজোন নির্দোষ, সুতরাং আপনি এটিটি ব্যবহার করতে পারবেন না datetime.astimezone

আপনি এটির মতো একটি সময় অঞ্চল দিতে পারেন

import pytz  # 3rd party: $ pip install pytz

u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset

এখন আপনি সময় অঞ্চল পরিবর্তন করতে পারেন

print(u.astimezone(pytz.timezone("America/New_York")))

প্রদত্ত টাইমজোনটিতে বর্তমান সময়টি পেতে, আপনি datetime.now()সরাসরি জিনফোর পাস করতে পারবেন :

#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz

print(datetime.now(pytz.timezone("America/New_York")))

এটি যে কোনও টাইমজোনের সাথে কাজ করে যা দিবালোক সংরক্ষণের সময় (ডিএসটি) পর্যবেক্ষণ করে অর্থাত্ এটি সময় অঞ্চলগুলির জন্য কাজ করে যার বিভিন্ন সময়ে বিভিন্ন ইউটিসি অফসেট থাকতে পারে (নন-ফিক্সড ইউটিসি অফসেট)। ব্যবহার করবেন না tz.localize(datetime.now())- স্থানীয় সময় অস্পষ্ট হলে এটি ডিস্ট-অফ-ডিএসটি রূপান্তরের সময় ব্যর্থ হতে পারে।


216
তবে এটির সময় অঞ্চল নির্দোষ হওয়ার কোনও ভাল কারণ নেই - এটি ইউটিসি হিসাবে নির্দিষ্ট করা হয়েছে। তৃতীয় পক্ষের লাইব্রেরিটি সঠিকভাবে কাজ করার জন্য আপনাকে কেন অনুসন্ধান করতে হবে?
মার্ক রান্সম

4
আমি রাজী; আমার জন্য 'নির্দোষ' সময়গুলি সম্পূর্ণ অকেজো। Stdlib এ পাইটজ যুক্ত করার মুহূর্তে পাইথন তালিকায় আলোচনা রয়েছে; ইস্যুটি লাইসেন্সিংয়ের নয় তবে সত্য যে টাইমজোন ডেটা এতবার আপডেট হয় (যা পাইথন নিজেই হতে পারে না)। এছাড়াও পাইটজ প্রত্যাশিত উপায়ে tzinfo ইন্টারফেস বাস্তবায়ন করে না যাতে আপনি শহরের কিছু সময় অঞ্চল ব্যবহার করার চেষ্টা করলে ত্রুটিগুলি পেতে পারেন astimezone। সুতরাং ডেটটাইমের কেবল কোনও নেটিভ টাইমজোন নেই, তবে কেবলমাত্র জাজিনফোর বহুল-উপলভ্য বাস্তবায়ন অনুমিত মানটির সাথে সম্মতিযুক্ত নয়।
ববিনস

5
@ বোবিন্স পাইটজ এবং স্ট্যান্ডার্ড ডেটটাইম লাইব্রেরিগুলি আপনার জন্য কেন কাজ করে না? পাইথন কোর এবং পাইটজ স্বাধীন প্রকল্প হিসাবে বিকশিত হওয়ায় মূল দলের জন্য যৌক্তিক জটিলতা হ্রাস পায়। হ্যাঁ, পাইথন কোর দলের পক্ষে জটিলতা হ্রাস করা পাইথন ব্যবহারকারীদের সকলের জন্য জটিলতা বাড়িয়ে তোলে যাদের টাইমজোনগুলি মোকাবেলা করা প্রয়োজন তবে, আমি বিশ্বাস করি তারা একটি ভাল কারণে এই সিদ্ধান্ত নিয়েছিলেন। "স্ট্যান্ডার্ড লাইব্রেরিতে কোনও জিনফোর উদাহরণ নেই ..." নিয়মটি দুর্দান্ত কারণ এটি সহজ, কেন এখানে ব্যতিক্রম করবেন?
ডেরেক লিটজ

15
কীভাবে ঠিকu=datetime.now(pytz.utc)
ক্রেগ ম্যাককুইন

4
@ বাইন: ব্যবহার করবেন না tz.localize(datetime.now()); datetime.now(tz)পরিবর্তে ব্যবহার করুন।
jfs

142

নোট করুন পাইথন ৩.২ এর পরে datetimeমডিউলে রয়েছে datetime.timezone। এর জন্য ডকুমেন্টেশন datetime.utcnow()বলেছেন:

একটি সচেতন বর্তমান ইউটিসি ডেটটাইম কল করে পাওয়া যাবে ।datetime.now(timezone.utc)

সুতরাং আপনি এটি করতে পারেন:

>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)

2
কোনটি পছন্দসই? datetime.now(timezone.utc)বা datetime.utcnow(timezone.utc)?
জেসি ওয়েব

8
datetime.utcnow()কোন যুক্তি লাগে না। সুতরাং এটি হতে হবে datetime.now(timezone.utc)
ক্রেগ ম্যাককুইন

1
datetime.now()মেশিনের সময় datetime.utcnow()ফিরে আসবে তবে আসল ইউটিসি সময়টি ফিরিয়ে দেবে।
বাবু

13
@ বাবু: এটি ইউটিসি বলে বোঝানোর জন্য datetime.utcnow()সেট করে না tzinfo। কিন্তু সেট সহdatetime.now(datetime.timezone.utc) ইউটিসি সময় ফেরায় না tzinfo
ক্রেগ ম্যাককুইন

@ ক্রেইগএমসি কিউইন তাই এখন যদি আমরা tzএখন কোন কনস্ট্রাক্টরে কোনও বস্তুটি পাস করি তবে তা সেই সময়ক্ষেত্রের সময়টি ফিরে আসবে? ঠিক আছে! নির্দেশ করার জন্য ধন্যবাদ।
বাবু

71

স্ট্যান্ডার্ড পাইথন গ্রন্থাগারগুলিতে কোনও টিজিনফো ক্লাস অন্তর্ভুক্ত নেই (তবে পিপ 431 দেখুন )। আমি কেবল কারণগুলি অনুমান করতে পারি। ব্যক্তিগতভাবে আমি মনে করি ইউটিসির জন্য একটি জিনফোর ক্লাস অন্তর্ভুক্ত না করা একটি ভুল ছিল, কারণ এটি একটি স্ট্যান্ডার্ড বাস্তবায়ন করার পক্ষে যথেষ্ট বিতর্কিত।

সম্পাদনা করুন: যদিও গ্রন্থাগারে কোনও প্রয়োগ নেই, tzinfoডকুমেন্টেশনে উদাহরণ হিসাবে দেওয়া আছে ।

from datetime import timedelta, tzinfo

ZERO = timedelta(0)

# A UTC class.

class UTC(tzinfo):
    """UTC"""

    def utcoffset(self, dt):
        return ZERO

    def tzname(self, dt):
        return "UTC"

    def dst(self, dt):
        return ZERO

utc = UTC()

এটি ব্যবহার করতে, সচেতন ডেটটাইম অবজেক্ট হিসাবে বর্তমান সময়টি পেতে:

from datetime import datetime 

now = datetime.now(utc)

নেই datetime.timezone.utcপাইথন মধ্যে 3.2+:

from datetime import datetime, timezone 

now = datetime.now(timezone.utc)

8
এই শ্রেণিটি কেন প্রথম স্থানে সরবরাহ করা হয়নি (এবং আরও গুরুত্বপূর্ণভাবে, এর datetimeদ্বারা নির্মিত বস্তুর জন্য ব্যবহৃত হয়েছিল utcnow()) চিত্রটি দেখুন ...
আন্দ্রে কারন

17
টাইমজোন অবজেক্টটি timezone.utcঅবশেষে পাইথন ৩.২-এ যুক্ত করা হয়েছে। পশ্চাদপটে সামঞ্জস্যের জন্য, utcnow()এখনও একটি সময় অঞ্চল কম সময় অবজেক্ট দেয়, তবে আপনি কল করে যা চান তা পেতে পারেন now(timezone.utc)
mhsmith

4
@ আরগোভ, এটাই সেই ধরণের ভুলকে ঠিক করার যেটি পাইথন ৩-এর পক্ষে সুষ্ঠু খেলা হওয়ার কথা ছিল They তাদের পশ্চাদপদ সামঞ্জস্যতা নিয়ে উদ্বিগ্ন হওয়া উচিত নয়। গত কয়েক দিনের মধ্যে আমি পড়ার আরও একটি উদাহরণ রয়েছে - structমডিউলটি ইউনিকোড থেকে বাইট্রেস্টিংয়ে স্বয়ংক্রিয় রূপান্তর করবে, এবং চূড়ান্ত সিদ্ধান্ত ছিল খারাপ সিদ্ধান্তকে সামনে যেতে বাধা দিতে পূর্ববর্তী পাইথন 3 সংস্করণের সাথে সামঞ্জস্যতা ভেঙে দেওয়া।
মার্ক রান্সম

2
আমি হতবাক হয়েছি যে পাইথনের tzinfoডকুমেন্টেশনে কোডটি প্রয়োগের কোডের উদাহরণ অন্তর্ভুক্ত রয়েছে, তবে তারা ডেটটাইমে নিজেই সেই কার্যকারিতাটি অন্তর্ভুক্ত করে না! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
এলএস

1
@ এলএস হ্যাঁ, pytzএকটি দুর্দান্ত উত্স। উদাহরণ কোডটি রাখার জন্য আমি আমার উত্তর সম্পাদনা করার সময়, অন্য কেউ এরই মধ্যে প্রস্তাব দিয়েছিল এবং আমি তাদের বজ্র চুরি করতে চাইনি।
মার্ক

20

pytzমডিউল একটি বিকল্প, এবং আরেকটা হল python-dateutilযা যদিও এছাড়াও তৃতীয় পক্ষের প্যাকেজ ইতিমধ্যে আপনার অন্য নির্ভরতা এবং অপারেটিং সিস্টেম উপর নির্ভর করে পাওয়া যেতে পারে।

আমি কেবলমাত্র এই পদ্ধতিটি রেফারেন্সের জন্য অন্তর্ভুক্ত করতে চেয়েছিলাম- আপনি যদি ইতিমধ্যে python-dateutilঅন্য উদ্দেশ্যে ইনস্টল করেন তবে আপনি এটির tzinfoসাথে সদৃশ করার পরিবর্তে এটি ব্যবহার করতে পারেনpytz

import datetime
import dateutil.tz

# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())

# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())

# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())

আমি সম্মত হতে চাই যে কলগুলিতে utcnowইউটিসি টাইমজোন তথ্য অন্তর্ভুক্ত করা উচিত। আমি সন্দেহ করি যে এটি অন্তর্ভুক্ত নয় কারণ নেটিভ ডেটটাইম লাইব্রেরি ক্রস সামঞ্জস্যের জন্য নিষ্পাপ ডেটটাইমগুলির ডিফল্ট।


1
নামের ত্রুটি: নাম 'ডিটি' সংজ্ঞায়িত করা হয়নি
x অ্যাপল

আমি ডেটটাইম.ডেটটাইম.টুকফ্রোমটাইম স্ট্যাম্প () কলটি ব্যবহার করছিলাম এবং tzinfo যুক্ত করার দরকার ছিল, দ্বিতীয় সমাধানটি আমার পক্ষে কাজ করেছে: utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
ইয়ান লি

1
দ্রষ্টব্য: datetime.now(pytz_tz)যে সর্বদা কাজ করে; datetime.now(dateutil.tz.tzlocal())ডিএসটি স্থানান্তরের সময় ব্যর্থ হতে পারেপিইপি 495 - স্থানীয় সময় বিড়ম্বনাdateutil ভবিষ্যতে পরিস্থিতির উন্নতি করতে পারে ।
jfs


যেহেতু আমার প্রোগ্রাম ইতিমধ্যে আমদানি করতে হচ্ছে dateutilজন্য dateutil.parser, আমি এই সমাধান সেরা পছন্দ। এটা তোলে হিসাবে সহজ হিসাবে ছিল: utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())। ভায়োলা !!
এলএস

11

জুলিয়েন Danjou একটি ভাল ব্যাখ্যা নিবন্ধ লিখেছিলেন আপনি সময়ের অঞ্চলগুলোকে সঙ্গে কেন মোকাবিলা না করা উচিত । একটি অংশ:

আসলে, পাইথন ডেটটাইম এপিআই সর্বদা অজানা ডেটটাইম অবজেক্টগুলি ফেরত দেয় যা অত্যন্ত দুর্ভাগ্যজনক। প্রকৃতপক্ষে, আপনি এই অবজেক্টটির একটি পাওয়ার সাথে সাথে টাইমজোনটি কী তা জানার কোনও উপায় নেই, সুতরাং এই জিনিসগুলি তাদের নিজেরাই বেশ "অকেজো"।

হায়, যদিও আপনি ব্যবহার করতে পারেন utcnow(), আপনি এখনও টাইমজোন তথ্য দেখতে পাবেন না, যেমনটি আবিষ্কার করেছিলেন।

প্রস্তাবনা:

  • সর্বদা সচেতন datetimeঅবজেক্ট ব্যবহার করুন , যেমন সময় অঞ্চল তথ্য সহ। এটি নিশ্চিত করে যে আপনি তাদের সরাসরি তুলনা করতে পারবেন (সচেতন এবং অজানা datetime বস্তুর তুলনাযোগ্য নয়) এবং তাদের সঠিকভাবে ব্যবহারকারীদের কাছে ফিরিয়ে আনবেন। লিভারেজ pytz সময় অঞ্চল বস্তু আছে।

  • ইনপুট এবং আউটপুট স্ট্রিং ফর্ম্যাট হিসাবে আইএসও 8601 ব্যবহার করুন। ব্যবহারের datetime.datetime.isoformat()স্ট্রিং হিসেবে রিটার্ন টাইমস্ট্যাম্প যে বিন্যাস, যা সময় অঞ্চল তথ্য রয়েছে ব্যবহার ফরম্যাট।

  • আপনার যদি আইএসও 8601 ফর্ম্যাট টাইমস্ট্যাম্প যুক্ত স্ট্রিংগুলি পার্স করতে হয় তবে আপনি নির্ভর করতে পারেন iso8601, যা সঠিক টাইমজোন তথ্য সহ টাইমস্ট্যাম্পগুলি ফেরত দেয়। এটি টাইমস্ট্যাম্পগুলি সরাসরি তুলনীয় করে তোলে।


1
এটি সামান্য বিভ্রান্তিকর প্রস্তাবনা। থাম্বের নিয়মটি হ'ল, সময় অঞ্চলগুলির সাথে কখনই ডিল করবেন না। সর্বদা tz আনওয়্যার ইউটিসি অবজেক্টস (ইউপ অবজেক্টস) সংরক্ষণ এবং প্রেরণ করুন।
টাইমজোনটি কেবলমাত্র

1
এটি ইতিমধ্যে জুলিয়েনের চিন্তাগুলির সাথে মেলে বলে মনে হচ্ছে। তাঁর নির্দিষ্ট কোন প্রস্তাবনা (উপরে উল্লিখিত হিসাবে) বিভ্রান্তিকর?
জো

10

timezoneপাইথন ৩.২+ তে তথ্য যুক্ত করতে

import datetime

>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'

1
AttributeError: 'module' object has no attribute 'timezone' পাইথন ২.7.১৩ (ডিফল্ট, জানুয়ারী 19 2017, 14:48:08)
মার্সিন ওসিয়ানী

-6
from datetime import datetime 
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]

-13

ইউটিসি তারিখগুলি কোনও ইউটিসি হওয়ার কারণে কোনও টাইমজোন তথ্যের প্রয়োজন হয় না, সংজ্ঞা অনুসারে এটি বোঝায় যে তাদের কোনও অফসেট নেই।


10
আমি যতদূর ডকস.পিথন.আর.গ্রাবারি / ডেটটাইম.ইচটিএমএল থেকে বলতে পারি , টিজিনফো ছাড়া একটি ডেটটাইম এমন এক যেখানে সময় অঞ্চলটি অনির্ধারিত। এখানে সময় অঞ্চল নির্দিষ্ট করা হয়েছে, সুতরাং যৌক্তিকভাবে এটি উপস্থিত থাকা উচিত। কোনও সম্পর্কিত সময় অঞ্চল ছাড়া তারিখ / সময় এবং ইউটিসি-তে অবশ্যই একটি পার্থক্য রয়েছে। (আদর্শভাবে তাদের বিভিন্ন ধরণের আইএমও হওয়া উচিত, তবে এটি অন্য বিষয় ...)
জন স্কিটি

@ জোনস্কিট আমার মনে হয় আপনি ইগনাসিওর কথাটি হারিয়েছেন যে ইউটিসি টাইমজোন নয়। আশ্চর্যজনক যে আমি এই টাইপ করার সাথে সাথে এই উত্তরের -9 স্কোর রয়েছে ...
সিএস

3
@ সিএসএস: আচ্ছা ইগনাসিও কখনও বলেন নি যে ... এবং ইউটিসি-তে কঠোরভাবে কথা বলার সময় সময় অঞ্চল নয়, সাধারণত জীবনকে যথেষ্ট সরল করে তোলার জন্য সাধারণত বিবেচনা করা হয় (পাইথন সহ, যেমন সহ pytz.utc)। নোট সেখানে যার ইউটিসি অফসেট অজানা এবং এক যেখানে এটা হতে 0. পরেরটির কি পরিচিত একটি মান মধ্যে একটি বড় পার্থক্য যে utcnow() উচিত ফিরে আইএমও। ডকুমেন্টেশন অনুসারে "একটি সচেতন অবজেক্টটি এমন একটি নির্দিষ্ট মুহুর্তকে সময় মতো উপস্থাপন করতে ব্যবহৃত হয় যা ব্যাখ্যার জন্য উন্মুক্ত নয়" ডকুমেন্টেশন অনুসারে এটি খাপ খায়।
জন স্কিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.