تبدیل تاریخ و زمان به و از رشته در تاریخ پایتون (strftime، strptime)

کسب و کار

تاریخچه تاریخ کتابخانه استاندارد پایتون را می توان برای پردازش تاریخ ها و زمان ها (تاریخ، زمان و زمان) استفاده کرد. متدهای strftime() و strptime()، که تاریخ ها و زمان ها را به رشته ها و از رشته ها تبدیل می کنند، می توانند برای دستکاری تاریخ ها و زمان ها در فرمت های مختلف استفاده شوند.

همچنین می تواند عملیاتی مانند تفریق و جمع را انجام دهد. به عنوان مثال شما می توانید به راحتی تاریخ 10 روز قبل یا 3 هفته بعد و یا زمان 50 دقیقه بعد را محاسبه و دریافت کنید.

ابتدا، کلاس های زیر از اشیاء موجود در ماژول datetime را شرح خواهیم داد.

  • datetime.datetime:تاریخ و زمان (تاریخ و ساعت)
  • datetime.date:تاریخ
  • datetime.time:زمان
  • datetime.timedelta:اختلاف زمانی و زمان سپری شده

متدهای strftime() و strptime()، که تاریخ/زمان و رشته را به یکدیگر تبدیل می‌کنند، نیز توضیح داده شده‌اند.

  • datetimeهدف – شی
    • datetime.now():تاریخ امروز، زمان فعلی
    • datetimeسازنده شی
    • تبدیل شیء datetime به شیء تاریخ
  • dateهدف – شی
    • date.today():تاریخ امروز
    • سازنده برای شی تاریخ
  • timeهدف – شی
    • سازنده برای شی زمان
  • timedeltaهدف – شی
    • برای ایجاد اشیاء timedelta، اشیاء datetime و date را کم کنید.
    • سازنده برای شی timedelta
    • تفریق و جمع با استفاده از اشیاء timedelta
  • strftime():تبدیل از تاریخ و زمان به رشته
  • strptime():تبدیل رشته به تاریخ و زمان

همچنین ماژول تقویم در کتابخانه استاندارد گنجانده شده است که تقویم ها را در قالب متن ساده یا HTML تولید می کند.

شی تاریخ

شیء datetime شیئی است که دارای اطلاعات تاریخ (سال، ماه، روز) و زمان (ساعت، دقیقه، ثانیه، میکروثانیه) است. شما می توانید با ویژگی های زیر به آن اطلاعات دسترسی پیدا کنید.

  • year
  • month
  • day
  • hour
  • minute
  • second
  • microsecond

datetime.now():تاریخ امروز، زمان فعلی

datetime.now() یک شی datetime با تاریخ امروز (تاریخ فعلی) و زمان فعلی به شما می دهد.

import datetime

dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231

print(type(dt_now))
# <class 'datetime.datetime'>

print(dt_now.year)
# 2018

print(dt_now.hour)
# 18

سازنده برای شی datetime

همچنین امکان تولید اشیاء datetime برای تاریخ ها و زمان های دلخواه وجود دارد.

سازنده شی datetime به صورت زیر است.

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

مقادیر زیر مورد نیاز است و سایر مقادیر را می توان حذف کرد. در صورت حذف، مقدار پیش فرض 0 است.

  • year
  • month
  • day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000

print(dt.minute)
# 15

print(dt.microsecond)
# 2000

dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00

print(dt.minute)
# 0

تبدیل شیء datetime به شیء تاریخ

همانطور که در ادامه توضیح داده شد، می توان یک شی datetime را با استفاده از متد date() به یک شی date تبدیل کرد.

print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>

print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>

شی تاریخ

شیء تاریخ، شیئی است که حاوی اطلاعات مربوط به تاریخ (سال، ماه، روز) است. با ویژگی های سال، ماه و روز قابل دسترسی است.

date.today():تاریخ امروز

شیء تاریخ تاریخ جاری (تاریخ امروز) را می توان با date.today() بدست آورد.

d_today = datetime.date.today()
print(d_today)
# 2018-02-02

print(type(d_today))
# <class 'datetime.date'>

print(d_today.year)
# 2018

سازنده برای شی تاریخ

سازنده شی date به صورت زیر است

date(year, month, day)

همه الزامی هستند و نمی توان آنها را حذف کرد.

d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01

print(d.month)
# 2

شی زمانی

شی زمان شی ای است که حاوی اطلاعاتی درباره زمان (ساعت، دقیقه، ثانیه و میکروثانیه) است. با استفاده از ویژگی های ساعت، دقیقه، ثانیه و میکروثانیه می توان به آن دسترسی داشت.

سازنده برای شی زمان

سازنده شی زمان به صورت زیر است.

time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

همه آنها اختیاری هستند و اگر حذف شوند روی 0 تنظیم می شوند.

t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000

print(type(t))
# <class 'datetime.time'>

print(t.hour)
# 12

t = datetime.time()
print(t)
# 00:00:00

شی timedelta

شی timedelta یک شی است که نشان دهنده اختلاف زمانی بین دو تاریخ و زمان یا زمان سپری شده است. اطلاعات آن بر حسب روز، ثانیه و میکروثانیه است و با ویژگی های روز، ثانیه و میکروثانیه قابل دسترسی است. همچنین با استفاده از روش total_seconds () می توان تعداد کل ثانیه ها را بدست آورد.

برای ایجاد شی timedelta، اشیاء datetime و date را کم کنید.

با کم کردن اشیاء datetime از یکدیگر یک شی timedelta به دست می آید.

td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231

print(type(td))
# <class 'datetime.timedelta'>

print(td.days)
# 1

print(td.seconds)
# 66673

print(td.microseconds)
# 271231

print(td.total_seconds())
# 153073.271231

تفریق اشیاء تاریخ از یکدیگر به طور مشابه یک شی timedelta به دست می دهد.

سازنده برای شی timedelta

سازنده شی timedelta به شرح زیر است

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

همه آنها اختیاری هستند و اگر حذف شوند روی 0 تنظیم می شوند.

توجه داشته باشید که شی timedelta فقط اطلاعات زیر را در خود دارد.

  • تعدادی روز:days
  • تعداد ثانیه:seconds
  • شمارش میکروثانیه:microseconds

برای مثال دو مورد زیر با هم برابرند

  • weeks=1
  • days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00

print(td_1w.days)
# 7

تفریق و جمع با استفاده از اشیاء timedelta

شی timedelta را می توان با اشیاء datetime و date برای انجام عملیاتی مانند تفریق و جمع استفاده کرد. به عنوان مثال می توانید به راحتی تاریخ یک هفته قبل یا 10 روز بعد و یا زمان 50 دقیقه بعد را محاسبه و دریافت کنید.

d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26

td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00

dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231

td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00

print(td_50m.seconds)
# 3000

dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231

همچنین می توان از آن برای محاسبه تعداد روزهای تا یک تاریخ خاص استفاده کرد.

d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00

print(td.days)
# 903

strftime():تبدیل از تاریخ و زمان به رشته

متد strftime() تاریخ و اشیاء تاریخ را می توان برای تبدیل اطلاعات تاریخ و زمان (تاریخ و زمان) به رشته ای با هر فرمتی استفاده کرد.

کد قالب بندی

برای اطلاع از کدهای قالب بندی موجود به مستندات رسمی زیر مراجعه کنید.

کدهای قالب بندی اصلی در زیر فهرست شده اند.

  • %d:روز ماه در نماد اعشاری با صفر پر شده است.
  • %m:ماه در نماد اعشاری با صفر پر شده است.
  • %y:دو رقم آخر سال با نماد اعشاری پر از صفر.
  • %Y:چهار رقم سال به صورت اعشاری با صفر پر شده است.
  • %H:وقتی با نماد اعشاری با صفر پر شده بیان می شود (نشان 24 ساعته)
  • %I:وقتی با نماد اعشاری با صفر پر شده بیان می شود (نشان 12 ساعته)
  • %M:برای نماد اعشاری با صفر پر شده است.
  • %S:ثانیه در نماد اعشاری با صفر پر شده است.
  • %f:میکرو ثانیه (6 رقم) به صورت اعشاری با 0 پر شده است.
  • %A:نام روز هفته برای منطقه
  • %a:نام روز برای منطقه (شکل مخفف)
  • %B:نام ماه محلی
  • %b:نام ماه محلی (فرم اختصاری)
  • %j:روز سال به صورت اعشاری با پر کردن صفر.
  • %U:شماره هفته سال به صورت اعشاری با پر کردن صفر (هفته از یکشنبه شروع می شود)
  • %W:شماره هفته سال به صورت اعشاری با پر کردن صفر (هفته از دوشنبه شروع می شود)

کدهای قالب بندی زیر برای نام های روز و ماه را می توان در رشته های مختلف بسته به منطقه به دست آورد.

  • %A
  • %a
  • %B
  • %b

همچنین یک روش اختصاصی برای رشته های فرمت ISO 8601 وجود دارد.

کد نمونه

print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13

print(d_today.strftime('%y%m%d'))
# 180202

print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018

print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05

اگر می خواهید به جای رشته یک عدد بگیرید، آن را با int() به عدد صحیح تبدیل کنید.

week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>

در ترکیب با شی timedelta، به راحتی می توان لیستی از تاریخ های دو هفته ای را در هر قالبی ایجاد کرد.

d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'

l = []

for i in range(n):
    l.append((d + i * td).strftime(f))

print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']

print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10

استفاده از نماد درک لیست هوشمندانه تر است.

l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']

strptime():تبدیل رشته به تاریخ و زمان

datetime strptime() می تواند برای ایجاد یک شی datetime از یک رشته تاریخ یا زمان استفاده شود. لازم است رشته قالب بندی مربوط به رشته اصلی را مشخص کنید.

همچنین یک روش اختصاصی برای رشته های ISO 8601 (Python 3.7 یا بالاتر) وجود دارد.

کد نمونه

date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00

print(type(date_dt))
# <class 'datetime.datetime'>

با استفاده از متد strftime() در شیء بازیابی شده datetime، می توانید تاریخ و زمان را در قالبی متفاوت از رشته اصلی نمایش دهید.

print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30

اگر آن را به یک شی datetime تبدیل کنید، می‌توانید با اشیاء timedelta نیز عملیات انجام دهید، به عنوان مثال، می‌توانید رشته‌ای از تاریخ 10 روز پیش را با همان قالب ایجاد کنید.

date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)

date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)

print(date_str_new)
# 2018-01-22
Copied title and URL