← Back

Home › Hindi › Date और Time Hindi में

Python datetime — तारीख और समय के साथ काम करना

🌐 यह page Hindi में है · Python cheat sheet Hindi में →

datetime बनानाFormattingParsingTimezone

चार types — कौन सा कब

from datetime import date, time, datetime, timedelta

date(2026, 10, 11)                    # सिर्फ तारीख
time(14, 30, 0)                       # सिर्फ समय
datetime(2026, 10, 11, 14, 30, 0)     # दोनों साथ
timedelta(days=7)                     # अंतर, कोई पल नहीं

datetime.now()                        # अभी (local, naive)
datetime.now(timezone.utc)            # अभी (UTC, aware) — यही लिखो
date.today()                          # आज की तारीख

# अलग-अलग हिस्से
dt = datetime(2026, 10, 11, 14, 30, 5)
dt.year, dt.month, dt.day             # 2026 10 11
dt.hour, dt.minute, dt.second         # 14 30 5
dt.weekday()                          # 6  — Monday=0
dt.isoweekday()                       # 7  — Monday=1
dt.date(), dt.time()                  # हिस्से अलग करना

weekday() और isoweekday() का फर्क याद रख लो — दोनों Monday से शुरू होते हैं पर numbering अलग है। यह off-by-one bug की क्लासिक जगह है।

Formatting — datetime से string

from datetime import datetime

dt = datetime(2026, 10, 11, 14, 30, 5)

dt.strftime("%Y-%m-%d")             # 2026-10-11
dt.strftime("%d/%m/%Y")             # 11/10/2026
dt.strftime("%H:%M:%S")             # 14:30:05
dt.strftime("%B %d, %Y")            # October 11, 2026
dt.strftime("%A")                   # Sunday
dt.strftime("%Y-%m-%dT%H:%M:%S")    # ISO 8601

# f-string में वही spec सीधे
f"{dt:%Y-%m-%d}"                    # 2026-10-11
f"{dt:%d %b %Y, %H:%M}"             # 11 Oct 2026, 14:30

# सबसे ज़्यादा काम के directives
# %Y 2026   %y 26   %m 10   %d 11   %H 14   %M 30   %S 05
# %B October   %b Oct   %A Sunday   %a Sun   %p PM

याद रखने का आसान तरीका: strftime = datetime from कुछ नहीं, to string। strptime = parse, यानी string to datetime। f और p से याद रखो।

Parsing — string से datetime

from datetime import datetime

# ISO 8601 हो तो format string बनाओ ही मत
datetime.fromisoformat("2026-10-11")
datetime.fromisoformat("2026-10-11T14:30:00")
datetime.fromisoformat("2026-10-11T14:30:00+05:30")
datetime.fromisoformat("2026-10-11T14:30:00Z")     # ✅ Python 3.11+

# 3.7 से 3.10 पर Z स्वीकार नहीं — पहले बदलो
raw = "2026-10-11T14:30:00Z"
datetime.fromisoformat(raw.replace("Z", "+00:00"))

# बाकी formats के लिए strptime
datetime.strptime("11/10/2026", "%d/%m/%Y")
datetime.strptime("11 Oct 2026", "%d %b %Y")
datetime.strptime("2026-10-11 14:30", "%Y-%m-%d %H:%M")
datetime.strptime("2026-10-11", "%d/%m/%Y")
# 💥 ValueError: time data '2026-10-11' does not match format '%d/%m/%Y'

# format को पूरी string account करनी पड़ती है
datetime.strptime("2026-10-11T14:30:00Z", "%Y-%m-%d %H:%M:%S")
# 💥 T और Z बच गए

नियम: ISO 8601 हो तो fromisoformat(), बाकी सब पर strptime()। ज़्यादातर API responses, database exports और logs ISO में होते हैं, इसलिए आधे से ज़्यादा मामलों में format string की ज़रूरत ही नहीं।

जोड़ और घटाव — timedelta

from datetime import datetime, timedelta

dt = datetime(2026, 10, 11, 14, 30)

dt + timedelta(days=7)              # एक हफ्ते बाद
dt - timedelta(hours=3)             # तीन घंटे पहले
dt + timedelta(weeks=2, days=3)
dt + timedelta(minutes=90)

# दो datetimes का अंतर — timedelta मिलता है
a = datetime(2026, 10, 11)
b = datetime(2026, 10, 1)
diff = a - b
diff.days                           # 10
diff.total_seconds()                # 864000.0

# timedelta के हिस्से — सावधान, ये उलझाते हैं
d = timedelta(days=1, hours=3)
d.days, d.seconds                   # 1, 10800  — hours अलग नहीं!
d.total_seconds() / 3600            # 27.0  — कुल घंटे, यही सही है
# महीने जोड़ना सीधे नहीं होता — timedelta में months नहीं है
dt + timedelta(months=1)        # 💥 TypeError: unexpected keyword

# तीस दिन जोड़ना महीना नहीं होता
jan31 = datetime(2026, 1, 31)
jan31 + timedelta(days=30)      # 2026-03-02  — 28 फरवरी!

# सही तरीका: calendar महीनों के लिए dateutil या zoneinfo
from dateutil.relativedelta import relativedelta
jan31 + relativedelta(months=1)   # 2026-02-28  — महीने का अंत

यह datetime की सबसे बड़ी trap है। timedelta में months और years नहीं होते, क्योंकि हर महीने की लंबाई अलग है। कैलेंडर महीने चाहिए तो dateutil.relativedelta install करो।

Timezone — naive बनाम aware

बिना timezone वाला datetime naive कहलाता है। दोनों को मिलाने पर TypeError आता है — और ये error बाद में, कहीं और आता है, इसलिए trace करना बहुत मुश्किल होता है।

from datetime import datetime, timezone

naive = datetime(2026, 10, 11, 14, 30)
aware = datetime(2026, 10, 11, 14, 30, tzinfo=timezone.utc)

naive < aware
# 💥 TypeError: can't compare offset-naive and offset-aware datetimes
from datetime import datetime, timezone, timedelta

# हमेशा aware बनाओ
now = datetime.now(timezone.utc)          # ✅
datetime.utcnow()                          # ⚠️ 3.12 में deprecated, naive देता है

IST = timezone(timedelta(hours=5, minutes=30))
now.astimezone(IST)                        # UTC से IST में बदलना

# naive को aware बनाना — मान्यता खुद बतानी पड़ती है
naive_ist = naive.replace(tzinfo=IST)

# zoneinfo — असली timezone नामों के लिए (Python 3.9+)
from zoneinfo import ZoneInfo
now.astimezone(ZoneInfo("Asia/Kolkata"))   # ✅ DST अपने आप संभालता है

नियम: boundary पर तय करो कि आपके datetimes aware हैं या naive, और आगे सब जगह वही रखो। Store हमेशा UTC में करो, और सिर्फ दिखाते वक्त local में बदलो। यही एक आदत ज़्यादातर timezone bugs खत्म कर देती है।

आम गलतियाँ

d = timedelta(hours=30)
d.days, d.hours        # AttributeError: 'timedelta' object has no attribute 'hours'
d.days, d.seconds      # 1, 21600   — seconds दिन के बचे हुए हिस्से हैं
d.total_seconds()      # 108000.0   — यही इस्तेमाल करो

🛠️ Practice करो (free, browser में)

पढ़ना काफी नहीं — यही bug खुद fix करके देखो। नीचे के problems browser में ही चलते हैं, कोई install नहीं, कोई login नहीं।

सारे free problems देखो →

अक्सर पूछे जाने वाले सवाल

strftime और strptime में क्या फर्क है?

strftime datetime को string में बदलता है (f for format)। strptime string को datetime में बनाता है (p for parse)। दोनों वही format specifiers इस्तेमाल करते हैं, बस दिशा उलटी है।

महीने कैसे जोड़ें?

timedelta में months नहीं होता, क्योंकि हर महीने की लंबाई अलग है। dateutil.relativedelta install करो — relativedelta(months=1) सही तरीके से महीने का अंत भी संभालता है।

naive और aware datetime क्या है?

naive में timezone की जानकारी नहीं होती, aware में होती है। दोनों को compare करने पर TypeError आता है। हमेशा aware रखो, store UTC में करो, और सिर्फ दिखाते वक्त local में बदलो।

ISO timestamp को कैसे parse करें?

datetime.fromisoformat() से — format string बनाओ ही मत। Python 3.11+ trailing Z भी संभाल लेता है; 3.7 से 3.10 पर Z को +00:00 से replace कर दो।

diff.days सही जवाब क्यों नहीं देता?

क्योंकि timedelta.days सिर्फ पूरे दिन गिनता है, और बाकी समय .seconds में चला जाता है। कुल अवधि चाहिए तो total_seconds() use करो और खुद घंटों या मिनटों में बदलो।

आगे पढ़ो