datetime.datetime.utcnow()
কেন datetime
এটিতে কোনও টাইমজোন তথ্য দেওয়া হয়নি যে এটি স্পষ্টতই একটি ইউটিসি datetime
?
আমি আশা করি এটিতে এটি থাকবে tzinfo
।
datetime.datetime.utcnow()
কেন datetime
এটিতে কোনও টাইমজোন তথ্য দেওয়া হয়নি যে এটি স্পষ্টতই একটি ইউটিসি datetime
?
আমি আশা করি এটিতে এটি থাকবে tzinfo
।
উত্তর:
এর অর্থ এটি টাইমজোন নির্দোষ, সুতরাং আপনি এটিটি ব্যবহার করতে পারবেন না 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())
- স্থানীয় সময় অস্পষ্ট হলে এটি ডিস্ট-অফ-ডিএসটি রূপান্তরের সময় ব্যর্থ হতে পারে।
astimezone
। সুতরাং ডেটটাইমের কেবল কোনও নেটিভ টাইমজোন নেই, তবে কেবলমাত্র জাজিনফোর বহুল-উপলভ্য বাস্তবায়ন অনুমিত মানটির সাথে সম্মতিযুক্ত নয়।
u=datetime.now(pytz.utc)
tz.localize(datetime.now())
; datetime.now(tz)
পরিবর্তে ব্যবহার করুন।
নোট করুন পাইথন ৩.২ এর পরে 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)
datetime.now(timezone.utc)
বা datetime.utcnow(timezone.utc)
?
datetime.utcnow()
কোন যুক্তি লাগে না। সুতরাং এটি হতে হবে datetime.now(timezone.utc)
।
datetime.now()
মেশিনের সময় datetime.utcnow()
ফিরে আসবে তবে আসল ইউটিসি সময়টি ফিরিয়ে দেবে।
datetime.utcnow()
সেট করে না tzinfo
। কিন্তু সেট সহdatetime.now(datetime.timezone.utc)
ইউটিসি সময় ফেরায় না tzinfo
tz
এখন কোন কনস্ট্রাক্টরে কোনও বস্তুটি পাস করি তবে তা সেই সময়ক্ষেত্রের সময়টি ফিরে আসবে? ঠিক আছে! নির্দেশ করার জন্য ধন্যবাদ।
স্ট্যান্ডার্ড পাইথন গ্রন্থাগারগুলিতে কোনও টিজিনফো ক্লাস অন্তর্ভুক্ত নেই (তবে পিপ 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)
datetime
দ্বারা নির্মিত বস্তুর জন্য ব্যবহৃত হয়েছিল utcnow()
) চিত্রটি দেখুন ...
timezone.utc
অবশেষে পাইথন ৩.২-এ যুক্ত করা হয়েছে। পশ্চাদপটে সামঞ্জস্যের জন্য, utcnow()
এখনও একটি সময় অঞ্চল কম সময় অবজেক্ট দেয়, তবে আপনি কল করে যা চান তা পেতে পারেন now(timezone.utc)
।
struct
মডিউলটি ইউনিকোড থেকে বাইট্রেস্টিংয়ে স্বয়ংক্রিয় রূপান্তর করবে, এবং চূড়ান্ত সিদ্ধান্ত ছিল খারাপ সিদ্ধান্তকে সামনে যেতে বাধা দিতে পূর্ববর্তী পাইথন 3 সংস্করণের সাথে সামঞ্জস্যতা ভেঙে দেওয়া।
tzinfo
ডকুমেন্টেশনে কোডটি প্রয়োগের কোডের উদাহরণ অন্তর্ভুক্ত রয়েছে, তবে তারা ডেটটাইমে নিজেই সেই কার্যকারিতাটি অন্তর্ভুক্ত করে না! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytz
একটি দুর্দান্ত উত্স। উদাহরণ কোডটি রাখার জন্য আমি আমার উত্তর সম্পাদনা করার সময়, অন্য কেউ এরই মধ্যে প্রস্তাব দিয়েছিল এবং আমি তাদের বজ্র চুরি করতে চাইনি।
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
ইউটিসি টাইমজোন তথ্য অন্তর্ভুক্ত করা উচিত। আমি সন্দেহ করি যে এটি অন্তর্ভুক্ত নয় কারণ নেটিভ ডেটটাইম লাইব্রেরি ক্রস সামঞ্জস্যের জন্য নিষ্পাপ ডেটটাইমগুলির ডিফল্ট।
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)
যে সর্বদা কাজ করে; datetime.now(dateutil.tz.tzlocal())
ডিএসটি স্থানান্তরের সময় ব্যর্থ হতে পারে । পিইপি 495 - স্থানীয় সময় বিড়ম্বনাdateutil
ভবিষ্যতে পরিস্থিতির উন্নতি করতে পারে ।
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())
(দ্রষ্টব্য: dateutil
একটি স্থির-অবিকৃত ইউটিসি অফসেট সহ (যেমন dateutil.tz.tzlocal()
) এখানে ব্যর্থ হতে পারে , পরিবর্তে একটি pytz
ভিত্তিক সমাধান ব্যবহার করুন )।
dateutil
জন্য dateutil.parser
, আমি এই সমাধান সেরা পছন্দ। এটা তোলে হিসাবে সহজ হিসাবে ছিল: utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())
। ভায়োলা !!
জুলিয়েন Danjou একটি ভাল ব্যাখ্যা নিবন্ধ লিখেছিলেন আপনি সময়ের অঞ্চলগুলোকে সঙ্গে কেন মোকাবিলা না করা উচিত । একটি অংশ:
আসলে, পাইথন ডেটটাইম এপিআই সর্বদা অজানা ডেটটাইম অবজেক্টগুলি ফেরত দেয় যা অত্যন্ত দুর্ভাগ্যজনক। প্রকৃতপক্ষে, আপনি এই অবজেক্টটির একটি পাওয়ার সাথে সাথে টাইমজোনটি কী তা জানার কোনও উপায় নেই, সুতরাং এই জিনিসগুলি তাদের নিজেরাই বেশ "অকেজো"।
হায়, যদিও আপনি ব্যবহার করতে পারেন utcnow()
, আপনি এখনও টাইমজোন তথ্য দেখতে পাবেন না, যেমনটি আবিষ্কার করেছিলেন।
প্রস্তাবনা:
সর্বদা সচেতন
datetime
অবজেক্ট ব্যবহার করুন , যেমন সময় অঞ্চল তথ্য সহ। এটি নিশ্চিত করে যে আপনি তাদের সরাসরি তুলনা করতে পারবেন (সচেতন এবং অজানাdatetime
বস্তুর তুলনাযোগ্য নয়) এবং তাদের সঠিকভাবে ব্যবহারকারীদের কাছে ফিরিয়ে আনবেন। লিভারেজ pytz সময় অঞ্চল বস্তু আছে।ইনপুট এবং আউটপুট স্ট্রিং ফর্ম্যাট হিসাবে আইএসও 8601 ব্যবহার করুন। ব্যবহারের
datetime.datetime.isoformat()
স্ট্রিং হিসেবে রিটার্ন টাইমস্ট্যাম্প যে বিন্যাস, যা সময় অঞ্চল তথ্য রয়েছে ব্যবহার ফরম্যাট।আপনার যদি আইএসও 8601 ফর্ম্যাট টাইমস্ট্যাম্প যুক্ত স্ট্রিংগুলি পার্স করতে হয় তবে আপনি নির্ভর করতে পারেন
iso8601
, যা সঠিক টাইমজোন তথ্য সহ টাইমস্ট্যাম্পগুলি ফেরত দেয়। এটি টাইমস্ট্যাম্পগুলি সরাসরি তুলনীয় করে তোলে।
timezone
পাইথন ৩.২+ তে তথ্য যুক্ত করতে
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone'
পাইথন ২.7.১৩ (ডিফল্ট, জানুয়ারী 19 2017, 14:48:08)
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]
ইউটিসি তারিখগুলি কোনও ইউটিসি হওয়ার কারণে কোনও টাইমজোন তথ্যের প্রয়োজন হয় না, সংজ্ঞা অনুসারে এটি বোঝায় যে তাদের কোনও অফসেট নেই।
pytz.utc
)। নোট সেখানে যার ইউটিসি অফসেট অজানা এবং এক যেখানে এটা হতে 0. পরেরটির কি পরিচিত একটি মান মধ্যে একটি বড় পার্থক্য যে utcnow()
উচিত ফিরে আইএমও। ডকুমেন্টেশন অনুসারে "একটি সচেতন অবজেক্টটি এমন একটি নির্দিষ্ট মুহুর্তকে সময় মতো উপস্থাপন করতে ব্যবহৃত হয় যা ব্যাখ্যার জন্য উন্মুক্ত নয়" ডকুমেন্টেশন অনুসারে এটি খাপ খায়।