본문 바로가기
파이썬

파이썬 datetime, locale, schedule의 다양한 사용사례

by 진심블로그 2024. 3. 18.

안녕하세요 파이신입니다.

 

- 본 글은 파이썬 중급자 이상이 읽어 보기에 적합합니다.

 

from datetime import datetime, timedelta

dt1 = datetime(2024,1,25,10,5,0)
dt2 = dt1 + timedelta(hours = 2)
print(dt2)

 

 

 

시간차이를 구하는 간단한 예입니다.

 

파이썬을 처음 접했을 때 datetime에서 %Y와 %y의 사소한 차이 때문에

몇 시간 동안 당황했던 기억이 납니다.

 

다음 코드에서 확인해 봅니다.

 

from datetime import datetime
dt1 = datetime.now()
dt1 = datetime(2020,1,1,2,2,3)
print(dt1)
print('{0:%Y-%m-%d} {0:%H:%M:%S}'.format(dt1))
print('{0:%Y %m} {0:%d %H %M %S}'.format(dt1))
print('{0:%Y %m %d %H %M %S}'.format(dt1))
print('{0:%Y %m %d %H %M %S}'.format(dt1))
print('{0:%Y %m %d %H %M %S}'.format(dt1))
print('{:%H %M %S}'.format(dt1))
print('{:%H}'.format(dt1))
print('{1}{0}'.format('1','3'))



print(f'{dt1.year} {dt1.month:02d} {dt1.day:02d} {dt1.hour:02d}')

 

 

일반적인 사용입니다. 아래에서 소문자로 바꿔봅니다.

 

print('{0:%y-%m-%d} {0:%H:%M:%S}'.format(dt1))

 

 

결과가 달라집니다.

 

이렇게만 찍어보면, 바로 알 수 있는 건데, 중첩된 코드가 갑자기 동작을 안 해서

원인을 찾느라 힘들었던 기억이 납니다. 오래전에요.

 

포맷을 좀 달리 해봅니다.

 

from datetime import datetime
dt1 = datetime.now()
print('{0:%Y-%m-%d %H:%M%S %p}'.format(dt1))
print('{0:%A %a %w}'.format(dt1))
print('{0:%B %b}'.format(dt1))

 

 

 

 

이번엔 locale을 사용해 봅니다.

 

import locale
from datetime import datetime

locale_ori = locale.getlocale()
print(locale_ori)

dt1 = datetime.now()
locale.setlocale(locale.LC_ALL,'ko_KR.UTF-8') 

print('{0:%A %a %w %B %b}'.format(dt1))

 

 

 

 

포맷만 바꾸어 봅니다.

 

import locale
from datetime import datetime
locale_ori = locale.getlocale()
print(locale_ori)

dt1 = datetime.now()

string_time = dt1.strftime('%Y %m %d  %H %M %S')
print(string_time)

 

 

 

schedule을 사용해 봅니다.

 

multi thread와 multi processor에서 공통변수에 접근하는 문제는

항상 어려운 문제입니다.

 

별도로 관리하자니 코드가 우아하지 않게 되고,

직접 하자니 신경 쓸 게 많고 그런 문제죠.

 

간단한 작업들은 스케줄을 반복해서 이용해도 효과적입니다.

 

물론 부하도 적고, 메모리 문제도 발생하지 않는다는 전제에 그렇습니다.

 

정해진 시간에만 실행시키는 용도 말고도 활용할 수 있다는 정도로 이해하면

좋을 것 같습니다.

 

기본 코드입니다.

 

import schedule
import time
from datetime import datetime

def job():    
    print(f'schedule..{datetime.now()}')

schedule.every(3).seconds.do(job)
schedule.every().minute.at(':5').do(job)

while True:
    try : 
        schedule.run_pending()
        time.sleep(1)
    except:
        schedule.clear()
        break;

 

스케쥴을 재귀에 포함시켜도 잘 동작합니다.

 

비슷한 코드입니다.

 

import schedule
from datetime import datetime
import time

def func1(a):
    print(f'run : {a} : {datetime.now()}')

schedule.every(5).seconds.do(func1,'korea')

while True:
    try:
        schedule.run_pending()
        time.sleep(1)
    except:
        schedule.clear()
        break

 

 

직관적인 코드로 다시 만들어 보겠습니다.

 

import schedule
from datetime import datetime
import time

def func1(a):
    print(f'func 1 : {a} : {datetime.now()}')

def func2(a):    
    print(f'func 2 : {a} : {datetime.now()}')

scheduler1 = schedule.Scheduler()
scheduler2 = schedule.Scheduler()

scheduler1.every(5).seconds.do(func1,'korea')
scheduler2.every(3).seconds.do(func2,'japan')

while True:
    try:
        scheduler1.run_pending()
        scheduler2.run_pending()
        time.sleep(1)
    except:
        scheduler1.clear()
        scheduler2.clear()
        break

 

 

즐거운 코딩 생활 되기 바랍니다.