Skip to main content

λ‚ μ§œμ™€ μ‹œκ°„

In Python, λ‚ μ§œμ™€ μ‹œκ°„μ„ λ‹€λ£¨λŠ” how to, let's learn. datetime module은 μ‹œκ°„ κ΄€λ ¨ μž‘μ—…μ˜ 핡심 도ꡬ.

datetime module μ†Œκ°œ ⏰​

datetime module의 μ£Όμš” class:

  • datetime: λ‚ μ§œμ™€ μ‹œκ°„μ„ ν•¨κ»˜ λ‹€λ£Έ
  • date: λ‚ μ§œλ§Œ λ‹€λ£Έ
  • time: μ‹œκ°„λ§Œ λ‹€λ£Έ
  • timedelta: μ‹œκ°„ 차이λ₯Ό λ‹€λ£Έ
  • timezone: μ‹œκ°„λŒ€ 정보

ν˜„μž¬ λ‚ μ§œμ™€ μ‹œκ°„β€‹

ν˜„μž¬ datetime 얻기​

from datetime import datetime

# ν˜„μž¬ λ‚ μ§œμ™€ μ‹œκ°„
now = datetime.now()
print(now) # 2025-11-27 14:30:45.123456

# UTC ν˜„μž¬ μ‹œκ°„
utc_now = datetime.utcnow()
print(utc_now)

# 각 μš”μ†Œ μ ‘κ·Ό
print(f'연도: {now.year}')
print(f'μ›”: {now.month}')
print(f'일: {now.day}')
print(f'μ‹œ: {now.hour}')
print(f'λΆ„: {now.minute}')
print(f'초: {now.second}')
print(f'마이크둜초: {now.microsecond}')

ν˜„μž¬ λ‚ μ§œλ§Œ 얻기​

from datetime import date

# 였늘 λ‚ μ§œ
today = date.today()
print(today) # 2025-11-27

print(f'연도: {today.year}')
print(f'μ›”: {today.month}')
print(f'일: {today.day}')
print(f'μš”μΌ: {today.weekday()}') # 0(μ›”) ~ 6(일)
print(f'μš”μΌ: {today.isoweekday()}') # 1(μ›”) ~ 7(일)

datetime 객체 μƒμ„±ν•˜κΈ°β€‹

λ‚ μ§œμ™€ μ‹œκ°„ 생성​

from datetime import datetime, date, time

# νŠΉμ • λ‚ μ§œμ™€ μ‹œκ°„ 생성
dt = datetime(2025, 11, 27, 14, 30, 45)
print(dt) # 2025-11-27 14:30:45

# λ‚ μ§œλ§Œ 생성
d = date(2025, 11, 27)
print(d) # 2025-11-27

# μ‹œκ°„λ§Œ 생성
t = time(14, 30, 45)
print(t) # 14:30:45

# λ‚ μ§œμ™€ μ‹œκ°„ κ²°ν•©
dt_combined = datetime.combine(d, t)
print(dt_combined) # 2025-11-27 14:30:45

λ¬Έμžμ—΄κ³Ό datetime λ³€ν™˜ πŸ“β€‹

strftime: datetime β†’ λ¬Έμžμ—΄β€‹

from datetime import datetime

now = datetime.now()

# λ‹€μ–‘ν•œ 포맷으둜 λ³€ν™˜
print(now.strftime('%Y-%m-%d')) # 2025-11-27
print(now.strftime('%Yλ…„ %mμ›” %d일')) # 2025λ…„ 11μ›” 27일
print(now.strftime('%H:%M:%S')) # 14:30:45
print(now.strftime('%Y-%m-%d %H:%M:%S')) # 2025-11-27 14:30:45
print(now.strftime('%Y/%m/%d %p %I:%M')) # 2025/11/27 PM 02:30

μ£Όμš” 포맷 μ½”λ“œβ€‹

μ½”λ“œμ˜λ―Έμ˜ˆμ‹œ
%Y4자리 연도2025
%y2자리 연도25
%mμ›” (01-12)11
%Bμ›” 이름November
%bμ›” 이름 μΆ•μ•½Nov
%d일 (01-31)27
%Aμš”μΌWednesday
%aμš”μΌ μΆ•μ•½Wed
%Hμ‹œ (00-23)14
%Iμ‹œ (01-12)02
%MλΆ„ (00-59)30
%S초 (00-59)45
%pAM/PMPM
%f마이크둜초123456

strptime: λ¬Έμžμ—΄ β†’ datetime​

from datetime import datetime

# λ¬Έμžμ—΄μ„ datetime으둜 λ³€ν™˜
date_str = '2025-11-27'
dt = datetime.strptime(date_str, '%Y-%m-%d')
print(dt) # 2025-11-27 00:00:00

# μ‹œκ°„ 포함
datetime_str = '2025-11-27 14:30:45'
dt = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
print(dt)

# λ‹€μ–‘ν•œ ν˜•μ‹
formats = [
('2025/11/27', '%Y/%m/%d'),
('11/27/2025', '%m/%d/%Y'),
('27-Nov-2025', '%d-%b-%Y'),
('2025λ…„ 11μ›” 27일', '%Yλ…„ %mμ›” %d일'),
]

for date_str, fmt in formats:
dt = datetime.strptime(date_str, fmt)
print(f'{date_str} β†’ {dt}')

timedelta: μ‹œκ°„ 차이 계산 ⏱️​

Basic μ‚¬μš©λ²•β€‹

from datetime import datetime, timedelta

# timedelta 생성
delta = timedelta(
days=7,
hours=3,
minutes=30,
seconds=45
)

print(delta) # 7 days, 3:30:45
print(f'총 초: {delta.total_seconds()}')

λ‚ μ§œ 계산​

from datetime import datetime, timedelta

now = datetime.now()

# 미래 λ‚ μ§œ 계산
tomorrow = now + timedelta(days=1)
next_week = now + timedelta(weeks=1)
next_month = now + timedelta(days=30)
one_hour_later = now + timedelta(hours=1)

print(f'내일: {tomorrow}')
print(f'λ‹€μŒ μ£Ό: {next_week}')

# κ³Όκ±° λ‚ μ§œ 계산
yesterday = now - timedelta(days=1)
last_week = now - timedelta(weeks=1)

print(f'μ–΄μ œ: {yesterday}')
print(f'μ§€λ‚œ μ£Ό: {last_week}')

λ‚ μ§œ 차이 계산​

from datetime import datetime

# 두 λ‚ μ§œμ˜ 차이
birthday = datetime(1990, 5, 15)
now = datetime.now()

age_delta = now - birthday

print(f'μ‚΄μ•„μ˜¨ 일수: {age_delta.days}')
print(f'μ‚΄μ•„μ˜¨ μ‹œκ°„: {age_delta.total_seconds() / 3600:.0f}μ‹œκ°„')
print(f'λ‚˜μ΄: {age_delta.days // 365}μ„Έ')

μ‹œκ°„λŒ€ (Timezone) πŸŒβ€‹

timezone μ‚¬μš©β€‹

from datetime import datetime, timezone, timedelta

# UTC μ‹œκ°„
utc_now = datetime.now(timezone.utc)
print(f'UTC: {utc_now}')

# νŠΉμ • μ‹œκ°„λŒ€ (UTC+9, ν•œκ΅­)
kst = timezone(timedelta(hours=9))
kst_now = datetime.now(kst)
print(f'KST: {kst_now}')

# μ‹œκ°„λŒ€ λ³€ν™˜
utc_time = datetime(2025, 11, 27, 14, 30, tzinfo=timezone.utc)
kst_time = utc_time.astimezone(kst)
print(f'UTC: {utc_time}')
print(f'KST: {kst_time}')

pytz 라이브러리 (더 μ •ν™•ν•œ μ‹œκ°„λŒ€)​

# pip install pytz ν•„μš”
try:
import pytz
from datetime import datetime

# μ‹œκ°„λŒ€ 생성
seoul = pytz.timezone('Asia/Seoul')
new_york = pytz.timezone('America/New_York')
london = pytz.timezone('Europe/London')

# ν˜„μž¬ μ‹œκ°„μ„ 각 μ‹œκ°„λŒ€λ‘œ
now = datetime.now()
seoul_time = seoul.localize(now)

print(f'μ„œμšΈ: {seoul_time}')
print(f'λ‰΄μš•: {seoul_time.astimezone(new_york)}')
print(f'런던: {seoul_time.astimezone(london)}')

except ImportError:
print('pytz μ„€μΉ˜ ν•„μš”: pip install pytz')

μ‹€μ „ Example πŸ’‘β€‹

Example 1: D-day 계산기​

from datetime import datetime, date

def calculate_dday(target_date):
"""D-day 계산"""
if isinstance(target_date, str):
target_date = datetime.strptime(target_date, '%Y-%m-%d').date()

today = date.today()
delta = target_date - today

if delta.days > 0:
return f'D-{delta.days}'
elif delta.days == 0:
return 'D-Day!'
else:
return f'D+{abs(delta.days)}'

# μ‚¬μš© Example
exam_date = '2025-12-25'
print(f'μ‹œν—˜μΌ: {calculate_dday(exam_date)}')

wedding_date = date(2025, 6, 15)
print(f'κ²°ν˜Όμ‹: {calculate_dday(wedding_date)}')

Example 2: λ‚˜μ΄ 계산기​

from datetime import date

def calculate_age(birth_date):
"""만 λ‚˜μ΄ 계산"""
if isinstance(birth_date, str):
birth_date = datetime.strptime(birth_date, '%Y-%m-%d').date()

today = date.today()
age = today.year - birth_date.year

# 생일이 μ•ˆ μ§€λ‚¬μœΌλ©΄ 1μ‚΄ λΉΌκΈ°
if today.month < birth_date.month or \
(today.month == birth_date.month and today.day < birth_date.day):
age -= 1

return age

# μ‚¬μš© Example
birth = '1990-05-15'
age = calculate_age(birth)
print(f'만 λ‚˜μ΄: {age}μ„Έ')

Example 3: κ·Όλ¬΄μ‹œκ°„ 계산기​

from datetime import datetime, timedelta

class WorkTimeCalculator:
"""근무 μ‹œκ°„ 계산기"""

def __init__(self):
self.entries = []

def clock_in(self, time_str=None):
"""좜근 기둝"""
time = datetime.strptime(time_str, '%H:%M') if time_str else datetime.now()
self.entries.append({'in': time, 'out': None})
print(f'좜근: {time.strftime("%H:%M")}')

def clock_out(self, time_str=None):
"""퇴근 기둝"""
if not self.entries or self.entries[-1]['out'] is not None:
print('좜근 기둝이 μ—†μŠ΅λ‹ˆλ‹€')
return

time = datetime.strptime(time_str, '%H:%M') if time_str else datetime.now()
self.entries[-1]['out'] = time
print(f'퇴근: {time.strftime("%H:%M")}')

def get_total_hours(self):
"""총 근무 μ‹œκ°„"""
total = timedelta()

for entry in self.entries:
if entry['out']:
delta = entry['out'] - entry['in']
total += delta

hours = total.total_seconds() / 3600
return hours

def get_summary(self):
"""근무 μš”μ•½"""
total_hours = self.get_total_hours()
print(f'\n=== 근무 μ‹œκ°„ μš”μ•½ ===')
print(f'총 근무 μ‹œκ°„: {total_hours:.2f}μ‹œκ°„')
print(f'근무 일수: {len(self.entries)}일')
print(f'일평균: {total_hours/len(self.entries):.2f}μ‹œκ°„')

# μ‚¬μš© Example
calc = WorkTimeCalculator()
calc.clock_in('09:00')
calc.clock_out('18:00')
calc.clock_in('09:30')
calc.clock_out('17:30')
calc.get_summary()

Example 4: νƒ€μž„μŠ€νƒ¬ν”„ λ³€ν™˜β€‹

from datetime import datetime

class TimestampConverter:
"""Unix νƒ€μž„μŠ€νƒ¬ν”„ λ³€ν™˜κΈ°"""

@staticmethod
def datetime_to_timestamp(dt):
"""datetime β†’ timestamp"""
return int(dt.timestamp())

@staticmethod
def timestamp_to_datetime(ts):
"""timestamp β†’ datetime"""
return datetime.fromtimestamp(ts)

@staticmethod
def now_timestamp():
"""ν˜„μž¬ νƒ€μž„μŠ€νƒ¬ν”„"""
return int(datetime.now().timestamp())

# μ‚¬μš© Example
converter = TimestampConverter()

# ν˜„μž¬ νƒ€μž„μŠ€νƒ¬ν”„
now_ts = converter.now_timestamp()
print(f'ν˜„μž¬ νƒ€μž„μŠ€νƒ¬ν”„: {now_ts}')

# datetime β†’ timestamp
dt = datetime(2025, 11, 27, 14, 30, 0)
ts = converter.datetime_to_timestamp(dt)
print(f'{dt} β†’ {ts}')

# timestamp β†’ datetime
dt_back = converter.timestamp_to_datetime(ts)
print(f'{ts} β†’ {dt_back}')

Example 5: λ‚ μ§œ λ²”μœ„ 생성기​

from datetime import datetime, timedelta

def date_range(start_date, end_date, step_days=1):
"""λ‚ μ§œ λ²”μœ„ 생성"""
if isinstance(start_date, str):
start_date = datetime.strptime(start_date, '%Y-%m-%d')
if isinstance(end_date, str):
end_date = datetime.strptime(end_date, '%Y-%m-%d')

current = start_date
while current <= end_date:
yield current
current += timedelta(days=step_days)

# μ‚¬μš© Example
print('2025λ…„ 11μ›” λͺ¨λ“  λ‚ μ§œ:')
for dt in date_range('2025-11-01', '2025-11-30'):
print(dt.strftime('%Y-%m-%d %A'))

print('\n격주 ν™”μš”μΌ:')
start = datetime(2025, 11, 1)
end = datetime(2025, 12, 31)
for dt in date_range(start, end, step_days=14):
if dt.weekday() == 1: # ν™”μš”μΌ
print(dt.strftime('%Y-%m-%d'))

Example 6: 회의 μ‹œκ°„ 관리​

from datetime import datetime, timedelta

class Meeting:
"""회의 class"""

def __init__(self, title, start_time, duration_minutes):
self.title = title
self.start_time = start_time
self.duration = timedelta(minutes=duration_minutes)
self.end_time = start_time + self.duration

def __str__(self):
return (f'{self.title}\n'
f'μ‹œμž‘: {self.start_time.strftime("%H:%M")}\n'
f'μ’…λ£Œ: {self.end_time.strftime("%H:%M")}\n'
f'μ†Œμš”: {self.duration.total_seconds() / 60:.0f}λΆ„')

def is_overlapping(self, other):
"""λ‹€λ₯Έ νšŒμ˜μ™€ κ²ΉμΉ˜λŠ”μ§€ 확인"""
return (self.start_time < other.end_time and
self.end_time > other.start_time)

class Schedule:
"""일정 관리"""

def __init__(self):
self.meetings = []

def add_meeting(self, meeting):
"""회의 μΆ”κ°€"""
for existing in self.meetings:
if meeting.is_overlapping(existing):
print(f'⚠️ {existing.title}와 μ‹œκ°„μ΄ κ²ΉμΉ©λ‹ˆλ‹€!')
return False

self.meetings.append(meeting)
print(f'βœ… {meeting.title} 좔가됨')
return True

def show_schedule(self):
"""일정 보기"""
if not self.meetings:
print('λ“±λ‘λœ νšŒμ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€')
return

print('\n=== 였늘의 일정 ===')
for meeting in sorted(self.meetings, key=lambda m: m.start_time):
print(f'\n{meeting}')
print('-' * 30)

# μ‚¬μš© Example
schedule = Schedule()

# 회의 μΆ”κ°€
morning_meeting = Meeting(
'μ•„μΉ¨ μŠ€νƒ λ“œμ—…',
datetime.now().replace(hour=9, minute=0),
30
)
schedule.add_meeting(morning_meeting)

lunch_meeting = Meeting(
'점심 λ―ΈνŒ…',
datetime.now().replace(hour=12, minute=0),
60
)
schedule.add_meeting(lunch_meeting)

# κ²ΉμΉ˜λŠ” 회의 μ‹œλ„
overlap_meeting = Meeting(
'쀑볡 회의',
datetime.now().replace(hour=12, minute=30),
30
)
schedule.add_meeting(overlap_meeting)

schedule.show_schedule()

Example 7: μƒλŒ€μ  μ‹œκ°„ ν‘œμ‹œβ€‹

from datetime import datetime, timedelta

def relative_time(dt):
"""μƒλŒ€μ  μ‹œκ°„ ν‘œμ‹œ (예: '3μ‹œκ°„ μ „')"""
if isinstance(dt, str):
dt = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')

now = datetime.now()
delta = now - dt

seconds = delta.total_seconds()

if seconds < 60:
return '방금 μ „'
elif seconds < 3600:
minutes = int(seconds / 60)
return f'{minutes}λΆ„ μ „'
elif seconds < 86400:
hours = int(seconds / 3600)
return f'{hours}μ‹œκ°„ μ „'
elif seconds < 604800:
days = int(seconds / 86400)
return f'{days}일 μ „'
elif seconds < 2592000:
weeks = int(seconds / 604800)
return f'{weeks}μ£Ό μ „'
elif seconds < 31536000:
months = int(seconds / 2592000)
return f'{months}κ°œμ›” μ „'
else:
years = int(seconds / 31536000)
return f'{years}λ…„ μ „'

# μ‚¬μš© Example
times = [
datetime.now() - timedelta(seconds=30),
datetime.now() - timedelta(minutes=15),
datetime.now() - timedelta(hours=3),
datetime.now() - timedelta(days=2),
datetime.now() - timedelta(weeks=3),
]

for time in times:
print(f'{time.strftime("%Y-%m-%d %H:%M:%S")} β†’ {relative_time(time)}')

Example 8: μ˜μ—…μΌ 계산​

from datetime import datetime, timedelta

def is_weekend(date):
"""주말인지 확인"""
return date.weekday() >= 5 # 5=ν† , 6=일

def add_business_days(start_date, days):
"""μ˜μ—…μΌ μΆ”κ°€ (주말 μ œμ™Έ)"""
current = start_date
added = 0

while added < days:
current += timedelta(days=1)
if not is_weekend(current):
added += 1

return current

def count_business_days(start_date, end_date):
"""μ˜μ—…μΌ 계산"""
count = 0
current = start_date

while current <= end_date:
if not is_weekend(current):
count += 1
current += timedelta(days=1)

return count

# μ‚¬μš© Example
today = date.today()
print(f'였늘: {today.strftime("%Y-%m-%d %A")}')

# 5μ˜μ—…μΌ ν›„
after_5_days = add_business_days(today, 5)
print(f'5μ˜μ—…μΌ ν›„: {after_5_days.strftime("%Y-%m-%d %A")}')

# μ˜μ—…μΌ 수 계산
start = date(2025, 11, 1)
end = date(2025, 11, 30)
business_days = count_business_days(start, end)
print(f'11μ›” μ˜μ—…μΌ: {business_days}일')

λ‚ μ§œ 비ꡐ πŸ”β€‹

from datetime import datetime

dt1 = datetime(2025, 11, 27)
dt2 = datetime(2025, 12, 25)

# 비ꡐ μ—°μ‚°
print(dt1 < dt2) # True
print(dt1 > dt2) # False
print(dt1 == dt2) # False
print(dt1 != dt2) # True

# μ΅œλŒ€/μ΅œμ†Œ
dates = [
datetime(2025, 11, 27),
datetime(2025, 12, 25),
datetime(2025, 1, 1),
]

print(f'κ°€μž₯ 이λ₯Έ λ‚ μ§œ: {min(dates)}')
print(f'κ°€μž₯ λŠ¦μ€ λ‚ μ§œ: {max(dates)}')

Frequently Asked Questions ❓​

Q1: 월말 λ‚ μ§œλ₯Ό κ΅¬ν•˜λŠ” how to은?​

from datetime import datetime
from calendar import monthrange

def get_last_day_of_month(year, month):
"""νŠΉμ • μ›”μ˜ λ§ˆμ§€λ§‰ λ‚ """
last_day = monthrange(year, month)[1]
return datetime(year, month, last_day)

# μ‚¬μš© Example
last_day = get_last_day_of_month(2025, 2)
print(last_day) # 2025-02-28 (2025년은 평년)

Q2: 두 μ‹œκ°„μ΄ 같은 날인지 ν™•μΈν•˜λŠ” how to은?​

from datetime import datetime

dt1 = datetime(2025, 11, 27, 9, 0, 0)
dt2 = datetime(2025, 11, 27, 18, 0, 0)

# λ‚ μ§œλ§Œ 비ꡐ
same_day = dt1.date() == dt2.date()
print(same_day) # True

Q3: νŠΉμ • μš”μΌμ˜ λ‚ μ§œλ₯Ό μ°ΎλŠ” how to은?​

from datetime import datetime, timedelta

def next_weekday(start_date, weekday):
"""λ‹€μŒ νŠΉμ • μš”μΌ μ°ΎκΈ° (0=μ›”, 6=일)"""
days_ahead = weekday - start_date.weekday()
if days_ahead <= 0:
days_ahead += 7
return start_date + timedelta(days=days_ahead)

# λ‹€μŒ κΈˆμš”μΌ μ°ΎκΈ°
today = datetime.now()
next_friday = next_weekday(today, 4) # 4 = κΈˆμš”μΌ
print(f'λ‹€μŒ κΈˆμš”μΌ: {next_friday.strftime("%Y-%m-%d")}')

Q4: μ‹œκ°„μ„ λ°˜μ˜¬λ¦Όν•˜λŠ” how to은?​

from datetime import datetime, timedelta

def round_time(dt, round_to_minutes=15):
"""μ‹œκ°„μ„ νŠΉμ • λΆ„ λ‹¨μœ„λ‘œ 반올림"""
seconds = round_to_minutes * 60
rounded = dt + timedelta(seconds=seconds/2)
rounded -= timedelta(
seconds=rounded.second,
microseconds=rounded.microsecond
)
rounded -= timedelta(minutes=rounded.minute % round_to_minutes)
return rounded

# 15λΆ„ λ‹¨μœ„λ‘œ 반올림
now = datetime.now()
rounded = round_time(now, 15)
print(f'원본: {now.strftime("%H:%M:%S")}')
print(f'반올림: {rounded.strftime("%H:%M:%S")}')

Q5: ISO 8601 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” how to은?​

from datetime import datetime

now = datetime.now()

# ISO ν˜•μ‹μœΌλ‘œ λ³€ν™˜
iso_string = now.isoformat()
print(iso_string) # 2025-11-27T14:30:45.123456

# ISO ν˜•μ‹μ—μ„œ λ³€ν™˜
dt = datetime.fromisoformat('2025-11-27T14:30:45')
print(dt)

Performance Tips πŸš€β€‹

from datetime import datetime
import time

# ν˜„μž¬ μ‹œκ°„μ„ μ—¬λŸ¬ 번 μ‚¬μš©ν•  λ•Œ
# λ‚˜μ¨: 맀번 호좜
for i in range(1000):
now = datetime.now() # 맀번 μ‹œμŠ€ν…œ 호좜

# μ’‹μŒ: ν•œ 번만 호좜
now = datetime.now()
for i in range(1000):
# now μ‚¬μš©
pass

Next Steps​

  • JSONκ³Ό CSV: λ‚ μ§œ 데이터λ₯Ό 파일둜 μ €μž₯ν•˜κ³  뢈러였기
  • μ •κ·œν‘œν˜„μ‹: λ‚ μ§œ ν˜•μ‹ μΆ”μΆœκ³Ό 검증
  • dateutil 라이브러리: 더 κ°•λ ₯ν•œ λ‚ μ§œ νŒŒμ‹±
  • arrow 라이브러리: μ‚¬λžŒ μΉœν™”μ μΈ λ‚ μ§œ 처리