একটি অজগর ইউটিসি ডেটটাইমকে কেবলমাত্র অজগর স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে স্থানীয় ডেটটাইমে রূপান্তর করবেন?


188

আমার কাছে একটি অজগর ডেটটাইম উদাহরণ রয়েছে যা ডেটটাইম.টুকানো () ব্যবহার করে তৈরি হয়েছিল এবং ডাটাবেসে অবিচল ছিল।

প্রদর্শনের জন্য, আমি ডিফল্ট লোকাল টাইমজোন (যেমন, ডেটটাইম.নিউ () ব্যবহার করে তৈরি করা হয়েছে এমন ডেটাবেস থেকে প্রাপ্ত ডেটটাইম উদাহরণটি স্থানীয় ডেটাটাইমে রূপান্তর করতে চাই।

আমি কীভাবে ইউটিসি ডেটটাইমটিকে কেবলমাত্র পাইথন স্ট্যান্ডার্ড লাইব্রেরি (উদাহরণস্বরূপ, পাইটজ নির্ভরতা নয়) ব্যবহার করে স্থানীয় ডেটটাইমে রূপান্তর করতে পারি?

মনে হচ্ছে একটি সমাধান হ'ল ডেটটাইম.আসটাইমজোন (টিজেড) ব্যবহার করা, তবে আপনি কীভাবে ডিফল্ট স্থানীয় সময় অঞ্চল পাবেন?


সময় কোন ডাটাবেসে অব্যাহত ছিল? এটি যদি কোনও মান বিন্যাস হয় তবে এটি হতে পারে যে আপনাকে কোনও রূপান্তর করার দরকার নেই।
অপালালা

1
এই উত্তরটি পাইটজ ব্যবহারের একটি সহজ উপায় দেখায় ।
জুন

উত্তর:


272

পাইথন ৩.৩++ এ:

from datetime import datetime, timezone

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)

পাইথন 2/3 এ:

import calendar
from datetime import datetime, timedelta

def utc_to_local(utc_dt):
    # get integer timestamp to avoid precision lost
    timestamp = calendar.timegm(utc_dt.timetuple())
    local_dt = datetime.fromtimestamp(timestamp)
    assert utc_dt.resolution >= timedelta(microseconds=1)
    return local_dt.replace(microsecond=utc_dt.microsecond)

ব্যবহার pytz(উভয় পাইথন 2/3):

import pytz

local_tz = pytz.timezone('Europe/Moscow') # use your local timezone name here
# NOTE: pytz.reference.LocalTimezone() would produce wrong result here

## You could use `tzlocal` module to get local timezone on Unix and Win32
# from tzlocal import get_localzone # $ pip install tzlocal

# # get local timezone    
# local_tz = get_localzone()

def utc_to_local(utc_dt):
    local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
    return local_tz.normalize(local_dt) # .normalize might be unnecessary

উদাহরণ

def aslocaltimestr(utc_dt):
    return utc_to_local(utc_dt).strftime('%Y-%m-%d %H:%M:%S.%f %Z%z')

print(aslocaltimestr(datetime(2010,  6, 6, 17, 29, 7, 730000)))
print(aslocaltimestr(datetime(2010, 12, 6, 17, 29, 7, 730000)))
print(aslocaltimestr(datetime.utcnow()))

আউটপুট

পাইথন ৩.৩
2010-06-06 21:29:07.730000 MSD+0400
2010-12-06 20:29:07.730000 MSK+0300
2012-11-08 14:19:50.093745 MSK+0400
পাইথন 2
2010-06-06 21:29:07.730000 
2010-12-06 20:29:07.730000 
2012-11-08 14:19:50.093911 
pytz
2010-06-06 21:29:07.730000 MSD+0400
2010-12-06 20:29:07.730000 MSK+0300
2012-11-08 14:19:50.146917 MSK+0400

দ্রষ্টব্য: এটি ডিএসটি এবং এমএসকে টাইমজোনটির জন্য ইউটিসি অফসেটের সাম্প্রতিক পরিবর্তনটি অ্যাকাউন্টে নেয়।

আমি জানিনা উইন্ডোজে নন-পাইটজ সলিউশনগুলি কাজ করে কিনা।


1
'স্বাভাবিক' কী করে?
এভিআই

4
@ আভি: সাধারণভাবে: পাইটজ : টাইমজোনগুলির মধ্যে রূপান্তর করার সময় কেন স্বাভাবিক হওয়া দরকার? । দ্রষ্টব্য: বর্তমান বাস্তবায়নের সাথে এটি প্রয়োজনীয় নয় .normalize()কারণ এর উত্সের সময় অঞ্চলটি .astimezone()ইউটিসি।
jfs

1
TypeError: replace() takes no keyword argumentsপাইটজ সলিউশন চেষ্টা করার সময় আমি পাই ।
ক্রেগ

@ ক্রেগ কোড উত্তর হিসাবে আউটপুট প্রদর্শিত হিসাবে, ঠিক তেমন কাজ করে। সম্পূর্ণ ন্যূনতম কোড উদাহরণ তৈরি করুন যা টাইপআরারের দিকে পরিচালিত করে, আপনার পাইথন, পাইটজ সংস্করণগুলি উল্লেখ করুন এবং এটি আলাদা স্ট্যাক ওভারফ্লো প্রশ্ন হিসাবে পোস্ট করেন।
jfs

পাইথন 3.3+ সমাধানের জন্য দ্রুত পরামর্শ বিপরীত দিকে যেতে (নেটিভ টু ইউটিসি), এটি কাজ করে: local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
জেসনারহস

50

স্ট্যান্ডার্ড লাইব্রেরির কোনও টাইমজোন না থাকায় আপনি এটি কেবল স্ট্যান্ডার্ড লাইব্রেরি দিয়ে করতে পারবেন না। আপনার পাইটজ বা ডেটুটিল দরকার ।

>>> from datetime import datetime
>>> now = datetime.utcnow()
>>> from dateutil import tz
>>> HERE = tz.tzlocal()
>>> UTC = tz.gettz('UTC')

The Conversion:
>>> gmt = now.replace(tzinfo=UTC)
>>> gmt.astimezone(HERE)
datetime.datetime(2010, 12, 30, 15, 51, 22, 114668, tzinfo=tzlocal())

বা ভাল, আপনি নিজের টাইমজোনগুলি প্রয়োগ করে পাইটজ বা ডেটুটিল ছাড়াই এটি করতে পারেন। তবে তা নির্বোধ হবে।


ধন্যবাদ, আমার যদি কখনও কোনও পূর্ণ সমাধানের প্রয়োজন হয় তবে আমি তা হাতে রাখব। ডেটুটিল কি পাইথন ৩.১ সমর্থন করে (পাইথন ২.৩++ বলে তবে এটি সন্দেহজনক)?
নাইট্রো জার্ক


পাইৎজ প্রকৃতপক্ষে ডিএসটি পরিবর্তনগুলি আরও ভালভাবে পরিচালনা করে।
লেনার্ট রেগেব্রো

2
আপডেট: পাইটজ এবং ডেটুটিল উভয় আজকাল পাইথন 3 সমর্থন করে।
লেনার্ট রেগেব্রো

1
@ জেফাসেবাস্টিয়ান: ডেটুটিল ডিএসটি পরিবর্তনের সময় ঘটে যাওয়া 1:30:30 বারের মধ্যে পার্থক্য করতে পারে না। আপনার যদি সেই দুটি সময়ের মধ্যে পার্থক্য করতে সক্ষম হতে হয় তবে পাইটজ ব্যবহার করার জন্য এটির কাজটি করা উচিত যা এটি পরিচালনা করতে পারে।
লেনার্ট রেগেব্রো

8

আপনি স্ট্যান্ডার্ড লাইব্রেরি দিয়ে এটি করতে পারবেন না। পাইটজ মডিউল ব্যবহার করে আপনি যে কোনও নিষ্পাপ / সচেতন ডেটটাইম অবজেক্টকে অন্য যে কোনও সময় অঞ্চলে রূপান্তর করতে পারেন। পাইথন 3 ব্যবহার করে কয়েকটি উদাহরণ দেখতে দিন।

শ্রেণি পদ্ধতির মাধ্যমে নিষ্পাপ বস্তু তৈরি utcnow()

কোনও নিষ্পাপ বস্তুকে অন্য যে কোনও সময় অঞ্চলে রূপান্তর করতে, আপনাকে প্রথমে সচেতন তারিখের অবজেক্টে রূপান্তর করতে হবে । আপনি replaceএকটি নিষ্পাপ ডেটটাইম অবজেক্টকে সচেতন ডেটটাইম অবজেক্টে রূপান্তর করার জন্য পদ্ধতিটি ব্যবহার করতে পারেন । তারপরে একটি সচেতন ডেটটাইম অবজেক্টকে অন্য যে কোনও সময় অঞ্চলে রূপান্তর করতে আপনি astimezoneপদ্ধতিটি ব্যবহার করতে পারেন ।

ভেরিয়েবল pytz.all_timezonesআপনাকে পাইটজ মডিউলে সমস্ত উপলব্ধ সময় অঞ্চলগুলির তালিকা দেয়।

import datetime,pytz

dtobj1=datetime.datetime.utcnow()   #utcnow class method
print(dtobj1)

dtobj3=dtobj1.replace(tzinfo=pytz.UTC) #replace method

dtobj_hongkong=dtobj3.astimezone(pytz.timezone("Asia/Hong_Kong")) #astimezone method
print(dtobj_hongkong)

শ্রেণি পদ্ধতির মাধ্যমে নিষ্পাপ বস্তু তৈরি now()

কারণ nowপদ্ধতিটি বর্তমান তারিখ এবং সময়কে ফেরত দেয়, তাই আপনাকে প্রথমে ডেটটাইম অবজেক্টের সময় অঞ্চলকে সচেতন করতে হবে। localize ফাংশন একটি পরিবর্তিত সাদাসিধা একটি সময় অঞ্চল-সচেতন DATETIME বস্তুর মধ্যে DATETIME অবজেক্ট। তারপরে আপনি astimezoneএটিকে অন্য টাইমজোনতে রূপান্তর করতে পদ্ধতিটি ব্যবহার করতে পারেন ।

dtobj2=datetime.datetime.now()

mytimezone=pytz.timezone("Europe/Vienna") #my current timezone
dtobj4=mytimezone.localize(dtobj2)        #localize function

dtobj_hongkong=dtobj4.astimezone(pytz.timezone("Asia/Hong_Kong")) #astimezone method
print(dtobj_hongkong)

6

আমি মনে করি আমি এটি আবিষ্কার করেছি: যুগের পর থেকে কয়েক সেকেন্ডের গণনা করে, তারপরে টাইম.লোকালটাইম ব্যবহার করে স্থানীয় টাইমজিয়নে রূপান্তরিত হয় এবং তারপরে সময় কাঠামোটিকে ডেটটাইমে রূপান্তরিত করে ...

EPOCH_DATETIME = datetime.datetime(1970,1,1)
SECONDS_PER_DAY = 24*60*60

def utc_to_local_datetime( utc_datetime ):
    delta = utc_datetime - EPOCH_DATETIME
    utc_epoch = SECONDS_PER_DAY * delta.days + delta.seconds
    time_struct = time.localtime( utc_epoch )
    dt_args = time_struct[:6] + (delta.microseconds,)
    return datetime.datetime( *dt_args )

এটি গ্রীষ্ম / শীতের ডিএসটি সঠিকভাবে প্রয়োগ করে:

>>> utc_to_local_datetime( datetime.datetime(2010, 6, 6, 17, 29, 7, 730000) )
datetime.datetime(2010, 6, 6, 19, 29, 7, 730000)
>>> utc_to_local_datetime( datetime.datetime(2010, 12, 6, 17, 29, 7, 730000) )
datetime.datetime(2010, 12, 6, 18, 29, 7, 730000)

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

আমার কেবলমাত্র ইউটিসি / স্থানীয় রূপান্তর প্রয়োজন তাই এ জাতীয় লাইব্রেরিটি টেনে আনতে ওভারকিল মনে হয়। যেহেতু আমি আবেদনের একমাত্র ব্যবহারকারী তাই আমি কিছু সীমাবদ্ধতা নিয়ে বেঁচে থাকতে পারি। এটি নির্ভরতা সম্পর্কিত সমস্যাগুলি পরিচালনা করা (পাইথন 3 ?, উইন্ডোজ? মানের সমর্থন করুন ...) যা আমার ছোট স্ক্রিপ্টে কাজ করার চেয়ে ব্যয়বহুল হবে।
নাইট্রো জার্ক

1
আমরা হব. আপনার যদি পাইথন 3 প্রয়োজন হয়, তবে আপনার ভাগ্যের বাইরে। তবে অন্যথায় গবেষণা এবং নিজের সমাধান তৈরি করা কোনও গ্রন্থাগার ব্যবহারের তুলনায় ওভারকিল।
লেনার্ট রেজেব্রো

1
+1 (ডাউনভোটটি অফসেট করতে: স্ট্যান্ডলিব-কেবল সমাধানগুলি সন্ধান করার জন্য এটি বৈধ প্রয়োজন হতে পারে) উল্লিখিত ক্যাভিয়েট @ লেনার্টের সাথে। প্রদত্ত তারিখটি ইউনিক্স এবং উইন্ডোজ উভয় ক্ষেত্রেই ব্যর্থ হতে পারে । বিটিডব্লিউ, আপনি utctotimestamp(utc_dt) -> (seconds, microseconds)স্বচ্ছতার জন্য আপনার কোড থেকে নিষ্কাশন করতে পারেন , পাইথন ২.6-৩.x বাস্তবায়ন দেখুন
jfs

1
পাইটজ 3 (এবং ডেটুটিল) কিছু কাল থেকে পাইথন 3 এ কাজ করে, তাই পাইথন 3 / উইন্ডোজ / কোয়ালিটির সমস্যাগুলি এখন আর কোনও সমস্যা নয়।
লেনার্ট রেগেব্রো

6

আলেক্সির মন্তব্যে বিল্ডিং। এটি ডিএসটি-র জন্যও কাজ করা উচিত।

import time
import datetime

def utc_to_local(dt):
    if time.localtime().tm_isdst:
        return dt - datetime.timedelta(seconds = time.altzone)
    else:
        return dt - datetime.timedelta(seconds = time.timezone)

4

স্ট্যান্ডার্ড পাইথন লাইব্রেরিটি কারও সাথে আসে না tzinfo বাস্তবায়ন নিয়ে । আমি সর্বদা এটি ডেটটাইম মডিউলটির একটি আশ্চর্যজনক ঘাটতি বিবেচনা করেছি।

Tzinfo বর্গ জন্য ডকুমেন্টেশন কিছু দরকারী উদাহরণ সঙ্গে আসা নেই। বিভাগের শেষে বৃহত্তর কোড ব্লকটি সন্ধান করুন।


1
মূল প্রয়োগের মতো সম্পর্কে আমার ধারণা হ'ল কারণ কোনও দেশের ডিএসটি পিরিয়ড নির্ধারণের জন্য নির্দিষ্ট নিয়ম না থাকায় টাইমজোন ডাটাবেসটি নিয়মিত আপডেট করা দরকার। যদি আমি ভুল না হয়ে থাকি, উদাহরণস্বরূপ
জেভিএমকে

@ নাইট্রো জার্ক, কমপক্ষে তাদের ইউটিসির জন্য একটি হওয়া উচিত ছিল। osমডিউল অপারেটিং সিস্টেম ফাংশন উপর ভিত্তি করে স্থানীয় সময় জন্য এক প্রদান করে পারে।
মার্ক রান্সম

1
আমি ৩.২-তে নতুন বৈশিষ্ট্যগুলির তালিকাটি যাচাই করেছিলাম এবং তারা ইউটিসি টাইমজোনটি ৩.২-এ যুক্ত করেছেন ( ডক্টস.পিথন.আর . / দেবী / ওয়াটসনেউ / ৩.২.এইচটিএমএল# তারিখ ) যদিও স্থানীয় সময় অঞ্চল বলে মনে হচ্ছে না ...
নাইট্রো জার্ক

1

পাইথন ৩.৯ zoneinfoমডিউলটি যুক্ত করেছে যাতে এখন এটি নিম্নলিখিত হিসাবে করা যায় (কেবলমাত্র স্টাডলিব):

from zoneinfo import ZoneInfo
from datetime import datetime

utc_unaware = datetime(2020, 10, 31, 12)  # loaded from database
utc_aware = utc_unaware.replace(tzinfo=ZoneInfo('UTC'))  # make aware
local_aware = utc_aware.astimezone(ZoneInfo('localtime'))  # convert

মধ্য ইউরোপটি ইউটিসি থেকে 1 বা 2 ঘন্টা এগিয়ে, তাই local_aware:

datetime.datetime(2020, 10, 31, 13, 0, tzinfo=backports.zoneinfo.ZoneInfo(key='localtime'))

যেমন str:

2020-10-31 13:00:00+01:00

উইন্ডোজের কোনও সিস্টেম টাইম জোন ডাটাবেস নেই, সুতরাং এখানে একটি অতিরিক্ত প্যাকেজ প্রয়োজন:

pip install tzdata  

পাইথন 3.6 থেকে 3.8 এ ব্যবহারের অনুমতি দেওয়ার জন্য একটি ব্যাকপোর্ট রয়েছে :

sudo pip install backports.zoneinfo

তারপর:

from backports.zoneinfo import ZoneInfo

আপনার zoneinfoএখানেও দরকার নেই - জেফএসের উত্তরটির প্রথম অংশটি (পাইথন 3.3 + অংশ) দেখুন ;-)
MrFuppes

0

পাইথন 2 এবং 3 এ কাজ করে এমন একটি সহজ (তবে ত্রুটিযুক্ত) উপায়:

import time
import datetime

def utc_to_local(dt):
    return dt - datetime.timedelta(seconds = time.timezone)

এর সুবিধাটি হ'ল এটি একটি বিপরীত ফাংশন লিখতে তুচ্ছ


1
time.timezoneদিবালোকের সঞ্চয়গুলি বিবেচনায় না নেওয়ার ফলে এটি ভুল ফলাফল দেয় ।
গেয়ারাড

0

সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি সময় যেখানে অফসেট পেতে হয় আপনি হন, তবে বিয়োগ তখন থেকে।

def format_time(ts,offset):
    if not ts.hour >= offset:
        ts = ts.replace(day=ts.day-1)
        ts = ts.replace(hour=ts.hour-offset)
    else:
        ts = ts.replace(hour=ts.hour-offset)
    return ts

এটি আমার জন্য পাইথন ২.৩.২ তে কাজ করে।


0

ডেটটাইম ফর্ম্যাটে টাইমজোন পরিবর্তন করার জন্য এখানে অন্য উপায় রয়েছে (আমি জানি আমি এটিতে আমার শক্তি নষ্ট করেছি তবে আমি এই পৃষ্ঠাটি দেখতে পেলাম না তবে আমি কীভাবে জানি না) কমপক্ষে। এবং সেকেন্ড আমার প্রকল্পের জন্য আমার এটির প্রয়োজন নেই কারণ:

def change_time_zone(year, month, day, hour):
      hour = hour + 7 #<-- difference
      if hour >= 24:
        difference = hour - 24
        hour = difference
        day += 1
        long_months = [1, 3, 5, 7, 8, 10, 12]
        short_months = [4, 6, 9, 11]
        if month in short_months:
          if day >= 30:
            day = 1
            month += 1
            if month > 12:
              year += 1
        elif month in long_months:
          if day >= 31:
            day = 1
            month += 1
            if month > 12:
              year += 1
        elif month == 2:
          if not year%4==0:
            if day >= 29:
              day = 1
              month += 1
              if month > 12:
                year += 1
          else:
            if day >= 28:
              day = 1
              month += 1
              if month > 12:
                year += 1
      return datetime(int(year), int(month), int(day), int(hour), 00)

সময় অঞ্চলগুলির মধ্যে স্যুইচ করতে টাইমডেল্টা ব্যবহার করুন। আপনার যা দরকার তা হ'ল সময় অঞ্চলগুলির মধ্যে কয়েক ঘন্টা মধ্যে অফসেট। একটি ডেটটাইম অবজেক্টের সমস্ত 6 টি উপাদানের জন্য সীমানা দিয়ে বেড়াতে হবে না। টাইমডেল্টা খুব সহজেই লিপ বছর, লিপ সেঞ্চুরি ইত্যাদি পরিচালনা করে। আপনাকে অবশ্যই 'ডেটটাইম আমদানির টাইমডেল্টা থেকে' করতে হবে। তারপরে যদি অফসেটটি কয়েক ঘন্টার মধ্যে পরিবর্তনশীল হয়: টাইমআউট = টাইমিন + টাইমডেল্টা (ঘন্টা = অফসেট), যেখানে টাইমিন এবং টাইমআউট ডেটটাইম অবজেক্ট। যেমন টাইমিন + টাইমডেল্টা (ঘন্টা = -8) GMT থেকে পিএসটি রূপান্তর করে।
কার্ল রুডনিক

0

এটি করার একটি ভয়ানক উপায় তবে এটি একটি সংজ্ঞা তৈরি করা এড়িয়ে যায়। এটি বেসিক পাইথন 3 গ্রন্থাগারের সাথে থাকা প্রয়োজন পূরণ করে to

# Adjust from UST to Eastern Standard Time (dynamic)
# df.my_localtime should already be in datetime format, so just in case
df['my_localtime'] = pd.to_datetime.df['my_localtime']

df['my_localtime'] = df['my_localtime'].dt.tz_localize('UTC').dt.tz_convert('America/New_York').astype(str)
df['my_localtime'] = pd.to_datetime(df.my_localtime.str[:-6])

যদিও এটি আকর্ষণীয় এবং আমি এই পদ্ধতিটি ব্যবহার করতে যাচ্ছি এটি কেবল স্টডিলিব ব্যবহার করে না। এটি পান্ডাসকে
টিম হিউজ

-3

সময় অঞ্চলগুলির মধ্যে স্যুইচ করতে টাইমডেল্টা ব্যবহার করুন। আপনার যা দরকার তা হ'ল সময় অঞ্চলগুলির মধ্যে কয়েক ঘন্টা মধ্যে অফসেট। একটি ডেটটাইম অবজেক্টের সমস্ত 6 টি উপাদানের জন্য সীমানা দিয়ে বেড়াতে হবে না। টাইমডেল্টা খুব সহজেই লিপ বছর, লিপ সেঞ্চুরি ইত্যাদি পরিচালনা করে। আপনাকে অবশ্যই প্রথমে

from datetime import datetime, timedelta

তারপরে যদি offsetঘন্টাগুলিতে সময় অঞ্চল ব-দ্বীপ হয়:

timeout = timein + timedelta(hours = offset)

যেখানে টাইমিন এবং সময়সীমা ডেটটাইম অবজেক্ট। যেমন

timein + timedelta(hours = -8)

GMT থেকে পিএসটি রূপান্তর করে।

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

def change_timezone(timein, timezone, timezone_out):
    '''
    changes timezone between predefined timezone offsets to GMT
    timein - datetime object
    timezone - 'PST', 'PDT', 'GMT' (can add more as needed)
    timezone_out - 'PST', 'PDT', 'GMT' (can add more as needed)
    ''' 
    # simple table lookup        
    tz_offset =  {'PST': {'GMT': 8, 'PDT': 1, 'PST': 0}, \
                  'GMT': {'PST': -8, 'PDT': -7, 'GMT': 0}, \
                  'PDT': {'GMT': 7, 'PST': -1, 'PDT': 0}}
    try:
        offset = tz_offset[timezone][timezone_out]
    except:
        msg = 'Input timezone=' + timezone + ' OR output time zone=' + \
            timezone_out + ' not recognized'
        raise DateTimeError(msg)

    return timein + timedelta(hours = offset)

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

timeout = timein.astimezone(pytz.timezone("GMT"))

উদাহরণস্বরূপ GMT রূপান্তর করতে। অবশ্যই, স্থানীয় বা অন্যথায় আপনার ইচ্ছামত অন্য যে কোনও সময় অঞ্চলকে / রূপান্তর করতে, পাইটজ বোঝে উপযুক্ত টাইমজোন স্ট্রিংটি ব্যবহার করুন (পাইটজ.ল_টাইমজোন থেকে) from দিবালোক সংরক্ষণের সময়টি তখন বিবেচনায় নেওয়া হয়।


1
এটি / না / একটি ভাল ধারণা। ডিএসটি পুরো পৃথিবীর জন্য একই তারিখে স্থানান্তরিত হয় না। এটি করার জন্য ডেটটাইম ফাংশন ব্যবহার করুন।
গ্যাবে

@ গাবে - বুঝতে পারেন যে টেবিলটি কোনও ভাল ধারণা নয়, যদিও এটি কেবলমাত্র মার্কিন টাইমজোনগুলি coveringাকা কারও পক্ষে উপযুক্ত। আমি যেমনটি বলেছি, সর্বোত্তম উপায় হ'ল ডেটটাইম অবজেক্টগুলিকে সর্বদা "সচেতন" করা যাতে আপনি ডেটটাইম ফাংশনগুলি সহজেই ব্যবহার করতে পারেন।
কার্ল রুডনিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.