পাইথনে দুটি ডেটটাইম অবজেক্টের মধ্যে সময়ের পার্থক্যটি কীভাবে খুঁজে পাব?


353

আমি দুটি datetimeবস্তুর মধ্যে মিনিটের মধ্যে সময়ের পার্থক্যটি কীভাবে বলব ?

উত্তর:


373
>>> import datetime
>>> first_time = datetime.datetime.now()
>>> later_time = datetime.datetime.now()
>>> difference = later_time - first_time
>>> seconds_in_day = 24 * 60 * 60
datetime.timedelta(0, 8, 562000)
>>> divmod(difference.days * seconds_in_day + difference.seconds, 60)
(0, 8)      # 0 minutes, 8 seconds

প্রথম সময় থেকে পরবর্তী সময়টি বিয়োগ করা difference = later_time - first_timeএকটি তারিখের সময় অবজেক্ট তৈরি করে যা কেবল পার্থক্য রাখে। উপরের উদাহরণে এটি 0 মিনিট, 8 সেকেন্ড এবং 562000 মাইক্রোসেকেন্ড রয়েছে।


2
তথ্যসূত্র: docs.python.org/library/datetime.html#datetime-objects । "সমর্থিত ক্রিয়াকলাপ" পড়ুন।
এসলট

@ সাইলেন্টগোস্ট, কীভাবে ঘন্টা, মিনিট, সেকেন্ড সহ
যাবেন

1
@মার্কিয়াল: deloreanভুল উপস্থাপনা datetime, pytzপদ্ধতির উদাহরণ, প্রারম্ভিক কোড উদাহরণটিd = datetime.now(timezone(EST)) (পাঁচটির পরিবর্তে একটি পঠনযোগ্য লাইন) হিসাবে লেখা যেতে পারে ।
jfs

1
দ্রষ্টব্য: স্থানীয় সময় প্রতিনিধিত্বকারী নিখুঁত ডেটটাইম অবজেক্টগুলিতে তারিখ / সময় গাণিতিক সম্পাদন করার সময় আপনার সতর্ক হওয়া উচিত। এটি ব্যর্থ হতে পারে যেমন, ডিএসটি রূপান্তরগুলি প্রায় around আমার উত্তরে আরও বিশদ সহ লিঙ্কটি
jfs

দিন, মিনিট, সেকেন্ডের ক্ষেত্রে পার্থক্য খুঁজতে সি কীভাবে ব্যবহৃত হয়?
জিশান মাহমুদ

151

পাইথন ২.7 এ নতুন timedeltaউদাহরণ উদাহরণ .total_seconds()। পাইথন ডক্স থেকে এটি সমান (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

তথ্যসূত্র: http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds

>>> import datetime
>>> time1 = datetime.datetime.now()
>>> time2 = datetime.datetime.now() # waited a few minutes before pressing enter
>>> elapsedTime = time2 - time1
>>> elapsedTime
datetime.timedelta(0, 125, 749430)
>>> divmod(elapsedTime.total_seconds(), 60)
(2.0, 5.749430000000004) # divmod returns quotient and remainder
# 2 minutes, 5.74943 seconds


106

ডেটটাইম উদাহরণ ব্যবহার করে

>>> from datetime import datetime
>>> then = datetime(2012, 3, 5, 23, 8, 15)        # Random date in the past
>>> now  = datetime.now()                         # Now
>>> duration = now - then                         # For build-in functions
>>> duration_in_s = duration.total_seconds()      # Total number of seconds between dates

বছর সময়কাল

>>> years = divmod(duration_in_s, 31536000)[0]    # Seconds in a year=365*24*60*60 = 31536000.

দিন সময়কাল

>>> days  = duration.days                         # Build-in datetime function
>>> days  = divmod(duration_in_s, 86400)[0]       # Seconds in a day = 86400

কয়েক ঘন্টা সময়কাল

>>> hours = divmod(duration_in_s, 3600)[0]        # Seconds in an hour = 3600

মিনিট সময়কাল

>>> minutes = divmod(duration_in_s, 60)[0]        # Seconds in a minute = 60

সেকেন্ডে সময়কাল

>>> seconds = duration.seconds                    # Build-in datetime function
>>> seconds = duration_in_s

মাইক্রোসেকেন্ডে সময়কাল

>>> microseconds = duration.microseconds          # Build-in datetime function  

দুটি তারিখের মধ্যে মোট সময়কাল

>>> days    = divmod(duration_in_s, 86400)        # Get days (without [0]!)
>>> hours   = divmod(days[1], 3600)               # Use remainder of days to calc hours
>>> minutes = divmod(hours[1], 60)                # Use remainder of hours to calc minutes
>>> seconds = divmod(minutes[1], 1)               # Use remainder of minutes to calc seconds
>>> print("Time between dates: %d days, %d hours, %d minutes and %d seconds" % (days[0], hours[0], minutes[0], seconds[0]))

বা সহজভাবে:

>>> print(now - then)

2019 সম্পাদনা করুন যেহেতু এই উত্তরটি ট্র্যাকশন অর্জন করেছে, আমি একটি ফাংশন যুক্ত করব যা কারওর জন্য ব্যবহারকে সহজতর করে তুলতে পারে

from datetime import datetime

def getDuration(then, now = datetime.now(), interval = "default"):

    # Returns a duration as specified by variable interval
    # Functions, except totalDuration, returns [quotient, remainder]

    duration = now - then # For build-in functions
    duration_in_s = duration.total_seconds() 

    def years():
      return divmod(duration_in_s, 31536000) # Seconds in a year=31536000.

    def days(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 86400) # Seconds in a day = 86400

    def hours(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 3600) # Seconds in an hour = 3600

    def minutes(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 60) # Seconds in a minute = 60

    def seconds(seconds = None):
      if seconds != None:
        return divmod(seconds, 1)   
      return duration_in_s

    def totalDuration():
        y = years()
        d = days(y[1]) # Use remainder to calculate next variable
        h = hours(d[1])
        m = minutes(h[1])
        s = seconds(m[1])

        return "Time between dates: {} years, {} days, {} hours, {} minutes and {} seconds".format(int(y[0]), int(d[0]), int(h[0]), int(m[0]), int(s[0]))

    return {
        'years': int(years()[0]),
        'days': int(days()[0]),
        'hours': int(hours()[0]),
        'minutes': int(minutes()[0]),
        'seconds': int(seconds()),
        'default': totalDuration()
    }[interval]

# Example usage
then = datetime(2012, 3, 5, 23, 8, 15)
now = datetime.now()

print(getDuration(then)) # E.g. Time between dates: 7 years, 208 days, 21 hours, 19 minutes and 15 seconds
print(getDuration(then, now, 'years'))      # Prints duration in years
print(getDuration(then, now, 'days'))       #                    days
print(getDuration(then, now, 'hours'))      #                    hours
print(getDuration(then, now, 'minutes'))    #                    minutes
print(getDuration(then, now, 'seconds'))    #                    seconds

7
আমি জানি না কেন কেউ আপনাকে ধন্যবাদ জানায় নি। এমন একটি সুনির্দিষ্ট উত্তরের জন্য আপনাকে অনেক ধন্যবাদ। @ অ্যাটাক
আমানদীপ সিং

এর TypeError: 'float' object is not subscriptableজন্য ব্যবহার করার সময় আমি ত্রুটি পেয়েছি :then = datetime(2017, 8, 11, 15, 58, tzinfo=pytz.UTC) now = datetime(2018, 8, 11, 15, 58, tzinfo=pytz.UTC) getDuration(then, now, 'years')
পাইটর ওয়াসেলিউইচ

1
এটি কারণ যে আমি এক বছরে সেকেন্ডের সংখ্যা গণনা করতে পারি না :) 365 * 24 * 60 * 60 = 31536000 এবং 31556926 নয় I আমি উত্তর এবং কার্যগুলি আপডেট করেছি এবং এটি এখনই কাজ করা উচিত।
আততাক

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
saran3h

28

একে অপরের থেকে বিয়োগ করুন। timedeltaপার্থক্য সহ আপনি একটি জিনিস পেতে ।

>>> import datetime
>>> d1 = datetime.datetime.now()
>>> d2 = datetime.datetime.now() # after a 5-second or so pause
>>> d2 - d1
datetime.timedelta(0, 5, 203000)

আপনি রূপান্তর করতে পারেন dd.days, dd.secondsএবং dd.microsecondsকয়েক মিনিট।


এই পরামিতি কি? মন্তব্যগুলি সুন্দর হবে
TheRealChx101

22

যদি a, bডেটটাইম অবজেক্ট হয় তবে পাইথন 3 এ তাদের মধ্যে সময়ের পার্থক্যটি সন্ধান করতে:

from datetime import timedelta

time_difference = a - b
time_difference_in_minutes = time_difference / timedelta(minutes=1)

পূর্ববর্তী পাইথন সংস্করণগুলিতে:

time_difference_in_minutes = time_difference.total_seconds() / 60

যদি a, bনির্দোষ ডেটটাইম অবজেক্টস যেমন datetime.now()তারপরে ফিরে আসে তবে ফলগুলি ভুল হতে পারে যদি অবজেক্টগুলি স্থানীয় সময়টিকে বিভিন্ন ইউটিসি অফসেটের সাথে উদাহরণস্বরূপ, ডিএসটি স্থানান্তর বা অতীতের / ভবিষ্যতের তারিখগুলির সাথে উপস্থাপন করে। আরও বিশদ: 24 ঘন্টা তারিখের সময় পার হয়ে গেছে তা খুঁজে বের করুন - পাইথন

নির্ভরযোগ্য ফলাফল পেতে, ইউটিসি সময় বা সময় অঞ্চল-সচেতন ডেটটাইম অবজেক্ট ব্যবহার করুন।


17

ডিভোড ব্যবহার করুন:

now = int(time.time()) # epoch seconds
then = now - 90000 # some time in the past

d = divmod(now-then,86400)  # days
h = divmod(d[1],3600)  # hours
m = divmod(h[1],60)  # minutes
s = m[1]  # seconds

print '%d days, %d hours, %d minutes, %d seconds' % (d[0],h[0],m[0],s)

1
এটি ডেটটাইম মডিউলে রাখা উচিত। আমি কেন বুঝতে পারছি না কেন এটি কেবল দিন, সেকেন্ড এবং মিলিস ব্যবহার করেছে ...
পাওলোচ্ফ

এটি ডেটটাইম অবজেক্ট সম্পর্কিত প্রশ্নের উত্তর দেয় না।
elec3647

10

এইভাবে আমি দুটি ডেটটাইম.ডেটটাইম অবজেক্টের মধ্যে কেটে যাওয়া ঘন্টার সংখ্যাটি পাই:

before = datetime.datetime.now()
after  = datetime.datetime.now()
hours  = math.floor(((after - before).seconds) / 3600)

9
এটি বেশ কার্যকর হবে না: timedelta.secondsকেবলমাত্র স্পষ্টভাবে সঞ্চিত সেকেন্ডের সংখ্যা দেয় - যা ডকুমেন্টেশনের গ্যারান্টিটি একদিনেরও কম কম হবে। আপনি চান (after - before).total_seconds(), যা পুরো ব-দ্বীপটিতে বিস্তৃত কয়েক সেকেন্ডের সংখ্যা দেয় ।
lvc

1
(after - before).total_seconds() // 3600(পাইথন ২.7) বা (after - before) // timedelta(seconds=3600)(পাইথন 3)
jfs

@lvc আমার পুরানো কোডটি আসলে সেভাবে লেখা হয়েছিল এবং আমি ভেবেছিলাম যে আমি স্মার্ট হয়ে এটিকে "ফিক্সিং" করছি। সংশোধনীর জন্য ধন্যবাদ.
টনি

@ জেফেসেবাস্টিয়ান তার জন্য ধন্যবাদ, আমি // অপারেটরের কথা ভুলে গিয়েছি। এবং আমি পাই পাই সিনট্যাক্সটি আরও ভাল পছন্দ করি তবে ২.7 ব্যবহার করছি।
টনি

9

কেবলমাত্র দিনের সংখ্যাটি সন্ধান করতে: টাইমডেল্টার একটি 'দিন' বৈশিষ্ট্য রয়েছে। আপনি কেবল এটি জিজ্ঞাসা করতে পারেন।

>>>from datetime import datetime, timedelta
>>>d1 = datetime(2015, 9, 12, 13, 9, 45)
>>>d2 = datetime(2015, 8, 29, 21, 10, 12)
>>>d3 = d1- d2
>>>print d3
13 days, 15:59:33
>>>print d3.days
13

5

টাইমডেলটার সাথে সাথে ফর্ম্যাটিংয়ের কথা উল্লেখ করাও কার্যকর মনে হতে পারে Just স্ট্রিপটাইম () একটি বিন্যাস অনুসারে একটি সময়কে প্রতিনিধিত্ব করে একটি স্ট্রিংকে পার্স করে।

from datetime import datetime

datetimeFormat = '%Y/%m/%d %H:%M:%S.%f'    
time1 = '2016/03/16 10:01:28.585'
time2 = '2016/03/16 09:56:28.067'  
time_dif = datetime.strptime(time1, datetimeFormat) - datetime.strptime(time2,datetimeFormat)
print(time_dif)

এটি আউটপুট দেবে: 0: 05: 00.518000


3

আমি এই জাতীয় কিছু ব্যবহার করি:

from datetime import datetime

def check_time_difference(t1: datetime, t2: datetime):
    t1_date = datetime(
        t1.year,
        t1.month,
        t1.day,
        t1.hour,
        t1.minute,
        t1.second)

    t2_date = datetime(
        t2.year,
        t2.month,
        t2.day,
        t2.hour,
        t2.minute,
        t2.second)

    t_elapsed = t1_date - t2_date

    return t_elapsed

# usage 
f = "%Y-%m-%d %H:%M:%S+01:00"
t1 = datetime.strptime("2018-03-07 22:56:57+01:00", f)
t2 = datetime.strptime("2018-03-07 22:48:05+01:00", f)
elapsed_time = check_time_difference(t1, t2)

print(elapsed_time)
#return : 0:08:52

2
আপনি পুরোপুরি ভাল ডেটটাইম পান, কেন আপনি সেগুলি অনুলিপি করেন? আপনার কোডের 75% এর দ্বারা প্রকাশ করা যেতে পারেreturn t1-t2
প্যাট্রিক আর্টনার

2

এটি বর্তমান সময় এবং সকাল 9.30 এর মধ্যে পার্থক্যটি সন্ধান করতে পারে

t=datetime.now()-datetime.now().replace(hour=9,minute=30)

1

এটি এমকিটাইম ব্যবহার করে আমার পন্থা ।

from datetime import datetime, timedelta
from time import mktime

yesterday = datetime.now() - timedelta(days=1)
today = datetime.now()

difference_in_seconds = abs(mktime(yesterday.timetuple()) - mktime(today.timetuple()))
difference_in_minutes = difference_in_seconds / 60

mktime()একটি ইনপুট হিসাবে স্থানীয় সময় আশা করে। স্থানীয় সময় সম্ভবত অস্পষ্ট এবং এক্ষেত্রে mktime()একটি ভুল উত্তর ফিরে আসতে পারে। ব্যবহার করুন a - bপরিবর্তে (ক, খ - DATETIME বস্তু)mktime()অপ্রয়োজনীয় এবং এটি কখনও কখনও ভুল হয়। এই ক্ষেত্রে এটি ব্যবহার করবেন না।
jfs

আমদানিতে আমার দোষ পাইথন 2.7.12
এডুয়ার্ডো

1

তারিখের মধ্যে পার্থক্য পেতে অন্যান্য উপায়ে;

import dateutil.parser
import datetime
last_sent_date = "" # date string
timeDifference = current_date - dateutil.parser.parse(last_sent_date)
time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds) / 60)

সুতরাং মিন আউটপুট পেতে।

ধন্যবাদ


1

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

from datetime import datetime

class TimeLogger:
    time_cursor = None

    def pin_time(self):
        global time_cursor
        time_cursor = datetime.now()

    def log(self, text=None) -> float:
        global time_cursor

        if not time_cursor:
            time_cursor = datetime.now()

        now = datetime.now()
        t_delta = now - time_cursor

        seconds = t_delta.total_seconds()

        result = str(now) + ' tl -----------> %.5f' % seconds
        if text:
            result += "   " + text
        print(result)

        self.pin_time()

        return seconds


time_logger = TimeLogger()

ব্যবহার:

from .tests_time_logger import time_logger
class Tests(TestCase):
    def test_workflow(self):
    time_logger.pin_time()

    ... my functions here ...

    time_logger.log()

    ... other function(s) ...

    time_logger.log(text='Tests finished')

এবং লগ আউটপুটে আমার কাছে এরকম কিছু রয়েছে

2019-12-20 17:19:23.635297 tl -----------> 0.00007
2019-12-20 17:19:28.147656 tl -----------> 4.51234   Tests finished

0

@ অ্যাটাকের দুর্দান্ত উত্তরের উপর ভিত্তি করে , আমি ডেটটাইম পার্থক্য ক্যালকুলেটরটির একটি স্বল্পতর সরলিকৃত সংস্করণ প্রস্তাব করছি:

seconds_mapping = {
    'y': 31536000,
    'm': 2628002.88, # this is approximate, 365 / 12; use with caution
    'w': 604800,
    'd': 86400,
    'h': 3600,
    'min': 60,
    's': 1,
    'mil': 0.001,
}

def get_duration(d1, d2, interval, with_reminder=False):
    if with_reminder:
        return divmod((d2 - d1).total_seconds(), seconds_mapping[interval])
    else:
        return (d2 - d1).total_seconds() / seconds_mapping[interval]

পুনরাবৃত্তিমূলক ক্রিয়াকলাপগুলি এড়াতে আমি এটিকে পরিবর্তন করেছি, প্রিন্টের পূর্বনির্ধারিত ডিফল্ট ব্যবধানটি সরিয়েছি এবং মিলিসেকেন্ড, সপ্তাহ এবং আইএসও মাসের জন্য সমর্থন যোগ করেছি (প্রতি মাসের সমান হয় এমন অনুমানের উপর ভিত্তি করে মাসগুলি কেবলমাত্র আনুমানিক 365/12)।

যা উত্পাদন করে:

d1 = datetime(2011, 3, 1, 1, 1, 1, 1000)
d2 = datetime(2011, 4, 1, 1, 1, 1, 2500)

print(get_duration(d1, d2, 'y', True))      # => (0.0, 2678400.0015)
print(get_duration(d1, d2, 'm', True))      # => (1.0, 50397.12149999989)
print(get_duration(d1, d2, 'w', True))      # => (4.0, 259200.00149999978)
print(get_duration(d1, d2, 'd', True))      # => (31.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'h', True))      # => (744.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'min', True))    # => (44640.0, 0.0014999997802078724)
print(get_duration(d1, d2, 's', True))      # => (2678400.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'mil', True))    # => (2678400001.0, 0.0004999997244524721)

print(get_duration(d1, d2, 'y', False))     # => 0.08493150689687975
print(get_duration(d1, d2, 'm', False))     # => 1.019176965856293
print(get_duration(d1, d2, 'w', False))     # => 4.428571431051587
print(get_duration(d1, d2, 'd', False))     # => 31.00000001736111
print(get_duration(d1, d2, 'h', False))     # => 744.0000004166666
print(get_duration(d1, d2, 'min', False))   # => 44640.000024999994
print(get_duration(d1, d2, 's', False))     # => 2678400.0015
print(get_duration(d1, d2, 'mil', False))   # => 2678400001.4999995
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.