날짜와 시간을 처리할 때 많이 쓰던 strptime과 strftime에 대해서 알아봅시다. 형식 코드들은 상당히 많으니, 이 문서를 참고해 보셔도 좋을 듯 합니다.

 


 먼저 strptime은 string을 파싱해서 datetime object로 돌려주는 역할을 합니다. 이 작업이 왜 중요한 건가? datetime으로 변환을 하면, 특정 날짜로부터 몇 일이 지났는지도 구할 수 있고, 두 날짜의 차이도 구할 수 있기 때문입니다. 이 strptime은 인자를 2개 받는데요. 하나는 string, 다른 하나는 format을 의미하는 string입니다.

 

 이제, YYYY-MM-DD hh:mm:ss 꼴로 들어왔다면, format string은 "%Y-%m-%d %H:%M:%S"로 받아주면 됩니다.

 

 예제를 하나 보겠습니다. 현재 날짜는 2022년 12월 11일이고요. 제가 블로그를 시작한 날짜는 2019년 6월 22일이였습니다. 블로그를 시작하고 나서 몇 일이 지났는지를 어떻게 구할까요? 간단하게, strptime으로 datetime.datetime 객체로 변환한 후에, 그 차이를 계산하면 됩니다.

 

 

 1268일이 나왔네요. 블로그를 시작하고 1268일이 경과했다는 의미가 되겠습니다.

 


 반대로, datetime object를 string으로 변환해 주는 것도 있습니다. 이는 strftime으로 할 수 있습니다.

 

 

 format을 넘겨주기만 하면 됩니다. 만약에, YYYY-MM-DD hh:mm:ss 꼴로 떨어트리려면 format을 "%Y-%m-%d %H:%M:%S"로 넘겨주면 됩니다.

 

 

 3번째 줄은 현재 날짜와 시각을 얻어옵니다. 다음에 4번째 줄에 datetime에 timedelta를 이용해서 무언가를 더하는데요. 30일을 더하게 되어요. 그리고 나서, 결과를 YYYY-MM-DD hh:mm:ss 꼴로 떨어트리고 있음을 볼 수 있어요.

 

 

 2023년 1월 10일 2시 51분 24분이 나오는군요.

 

 12월에는 31일까지 있으니, 30일이 지난 후에는 2023년 1월 10일이 되는 것이 맞겠네요.

 

 


 그런데, 이 시각들. 어느 지역일까요? 시간대가 우리 나라보다 3시간 빠른 곳이라고 해도 믿을 거 같습니다. 당연한 이야기겠지만, 지역마다 시간이 다른 경우 시간대 정보가 없으면 처리하기가 매우 곤란합니다. 어떻게 해야 할까요? 시간대 정보를 넣으면 됩니다.

 

 

 예를 들어, datetime.now를 봅시다. 이것은 현재 시각을 리턴합니다. 그런데, 여기에 timezone.utc를 넣으면 timezone 정보까지 들어간 시각을 리턴합니다. 이제, 이를 어떻게 처리하면 될까요? 6자리 밀리세컨드는 %f로 받으면 되고, timezone 정보는 %z로 받아버리면 됩니다.

 

 따라서 strftime에는 "%Y-%m-%d %H:%M:%S.%f%z"가 들어가면 됩니다.

 

 프로그램 실행 결과는 위와 같습니다. 그런데 +0000이라 붙는 게 조금 거슬려 보이는군요. 만약에 +hh:mm 형식으로 뽑으려면 어떻게 해야 할까요?

 

 %z 형식이 뒤에 붙으면 +hhmm이 됩니다. 끝에 2개를 : 뒤에 보내버리면 됩니다. 4번째 줄에서 현재 시각을 변환한 결과가 ..+hhmm 형식으로 나올 겁니다. s1[:-2]는 ..+hh까지를 의미하고, s1[-2:]는 mm을 의미합니다. 이 둘 사이에 :를 끼워넣으면 됩니다.

 

 그러면 어렵지 않게 뽑아낼 수 있습니다. 현재 utc 시각으로 2022년 12월 10일 18시 21분 12초라는 것을 알 수 있네요. pytz 같은 것도 찾아보시면 도움이 되지 않을까 싶습니다.