기본 콘텐츠로 건너뛰기

Python에서 시간 다루기 완전 가이드 (datetime, pendulum, arrow)

요즘 웹 개발하다 보면 시간 다루는 게 얼마나 중요한지 뼈저리게 느껴요. 데이터 분석할 때도 마찬가지고요. 파이썬 기본 라이브러리인 datetime만 써선 솔직히 한계가 있더라고요. 시간대 설정 잘못하면… 아, 생각만 해도 끔찍해요. 그래서 pendulumarrow라는 녀석들을 써봤는데, 정말 신세계였습니다! 이 글에선 제가 직접 겪은 시행착오와 꿀팁을 풀어놓을 테니, 시간 때문에 골치 썩는 분들께 도움이 됐으면 좋겠네요.

먼저, 기본기부터 짚고 넘어갈게요. datetime은 파이썬 기본 내장 모듈인데, 간단한 시간 출력 정도는 괜찮아요. 예를 들어, 현재 시간 출력하고 내일 날짜 구하는 건 식은 죽 먹기죠.

import datetime

now = datetime.datetime.now()
print(f"지금 이 순간: {now}") # 쨍한 현재 시간이 출력될 거예요!

tomorrow = now + datetime.timedelta(days=1)
print(f"내일은 바로 이 날!: {tomorrow}") # 내일 날짜가 뿅!

근데 문제는 시간대 처리나 복잡한 계산이 필요할 때예요. datetime만으론 힘들더라고요. 이럴 때 pendulum이나 arrow가 등장하는 거죠. 마치 시간 여행의 마법 지팡이처럼요! 두 라이브러리 모두 datetime의 불편함을 해결해주는 슈퍼히어로 같은 존재입니다. pendulum은 좀 더 강력하고 기능이 많고, arrow는 API가 깔끔해서 취향따라 고르면 됩니다. 저는 개인적으로 pendulum의 풍부한 기능이 더 마음에 들었어요.

자, 그럼 pendulum을 써서 시간대까지 고려한 시간 출력을 해볼게요.

import pendulum

seoul_time = pendulum.now("Asia/Seoul")
print(f"지금 서울 시간은?: {seoul_time}") # 서울 시간이 뙇!

tokyo_time = seoul_time.in_timezone("Asia/Tokyo")
print(f"도쿄 시간은 이렇게 다르네요?: {tokyo_time}") # 도쿄 시간도 바로 확인!

tomorrow_seoul = seoul_time.add(days=1)
print(f"내일 서울 시간은?: {tomorrow_seoul}") # 내일 서울 시간까지!

arrow도 비슷하게 쓸 수 있어요. 특히, 날짜 형식을 바꾸는 게 편리하더라고요. 예를 들어, YYYY-MM-DD HH:mm:ss ZZ 이런 식으로요. 직접 해보시면 아, 이래서 편하다! 하고 감탄하실 거예요.

하지만, 주의할 점이 있어요. arrow는 현재 개발이 중단되었다는 거! 새 프로젝트라면 pendulum을 쓰는 게 안전해요. 저도 처음엔 arrow를 썼다가 나중에 pendulum으로 갈아탔거든요. 후회는 없어요!

마지막으로, 가장 중요한 팁! 시간대는 항상 명시적으로 설정하세요! 이거 안 하면 시간 관련 버그에 시달릴 수 있어요. 제가 그랬거든요… 시간대 설정 까먹고 밤새 디버깅한 기억이 아직도 생생해요. 절대 잊지 마세요!

결론적으로, 파이썬으로 시간을 효율적으로 다루려면 datetime의 기본 기능을 이해하고, pendulum같은 강력한 라이브러리를 적절히 활용하는 게 중요합니다. 시간대 설정은 꼭 명시적으로! 그리고 프로젝트 상황에 맞는 라이브러리를 선택하는 것도 잊지 마세요. 이제 시간 때문에 스트레스 받지 마시고, 즐겁게 코딩하세요!

댓글

이 블로그의 인기 게시물

Django에서 트랜잭션 관리하기

Django에서 트랜잭션 관리하기 안녕하세요! 오늘은 Django에서 데이터베이스 트랜잭션을 효과적으로 관리하는 방법에 대해 알아보겠습니다. 1. 트랜잭션의 중요성 트랜잭션은 데이터베이스의 일관성과 무결성을 보장하는 중요한 개념입니다. Django에서는 여러 가지 방법으로 트랜잭션을 관리할 수 있습니다. 1.1 기본 개념 원자성(Atomicity) : 트랜잭션은 모두 실행되거나 모두 실행되지 않아야 합니다. 일관성(Consistency) : 트랜잭션 전후로 데이터베이스의 일관성이 유지되어야 합니다. 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로 영향을 주지 않아야 합니다. 지속성(Durability) : 완료된 트랜잭션의 결과는 영구적으로 저장되어야 합니다. 2. Django의 트랜잭션 관리 2.1 기본 설정 # settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'myuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '5432', 'ATOMIC_REQUESTS': True, # 모든 뷰를 트랜잭션으로 래핑 } } 2.2 데코레이터 사용 from django.db import transaction @transaction.atomic def create_order(user, items): order = Order.objects.create(user=...

AWS S3 + CloudFront로 정적 파일 서빙 완전 가이드

AWS S3 + CloudFront로 정적 파일 서빙 완전 가이드 안녕하세요! 오늘은 AWS S3와 CloudFront를 사용하여 정적 파일을 효율적으로 서빙하는 방법에 대해 알아보겠습니다. 왜 S3와 CloudFront를 사용할까요? 높은 가용성 : AWS의 글로벌 인프라를 활용 빠른 전송 속도 : CloudFront의 CDN 기능으로 전 세계 사용자에게 빠른 전송 비용 효율성 : 사용한 만큼만 지불 보안 : AWS의 보안 기능 활용 확장성 : 트래픽 증가에 자동 대응 1. S3 버킷 설정 1.1 버킷 생성 및 설정 import boto3 def create_s3_bucket(): s3 = boto3.client('s3') # 버킷 생성 bucket_name = 'your-static-files-bucket' s3.create_bucket( Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': 'ap-northeast-2' } ) # 버킷 정책 설정 bucket_policy = { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObje...

Python에서 asyncio 완전 정복 (await, async, gather 등)

어휴, 요즘 파이썬으로 비동기 프로그래밍 하는 재미에 푹 빠졌어요! 특히 asyncio 는 정말 마법 같더라고요. 처음엔 좀 낯설었는데, 익숙해지니까 속도 향상이 눈에 띄게 느껴져서 완전 반해버렸습니다. 이 글에선 제가 asyncio 를 배우면서 깨달은 점들을 풀어놓을게요. 혹시 비동기 프로그래밍이 뭔지 잘 모르시겠다면, 간단히 말해 여러 작업을 동시에 처리해서 프로그램 속도를 엄청나게 높이는 기술이라고 생각하시면 돼요. 마치 여러 요리사가 동시에 음식을 만들어서 손님에게 빨리 제공하는 것과 비슷하죠! 일단 async 와 await 라는 녀석들이 핵심인데요, async 는 함수 앞에 붙여서 "얘는 비동기 함수야!"라고 선언하는 거예요. 그리고 await 는 다른 비동기 함수가 끝날 때까지 기다리라고 지시하는 역할을 하죠. 예를 들어, 네트워크에서 데이터를 가져오는 함수가 있다면, await 를 사용해서 데이터가 다 가져올 때까지 기다렸다가 다음 작업을 진행할 수 있어요. 그 동안 다른 작업을 처리할 수 있으니, 마치 멀티태스킹을 하는 것처럼 느껴져요. 신기하지 않나요? 그리고 asyncio.gather 는 여러 비동기 함수를 동시에 실행하고 결과를 모아주는 아주 유용한 친구입니다. 제가 웹사이트 여러 개에서 데이터를 동시에 가져와야 할 때 정말 요긴하게 썼어요. 하나씩 순서대로 가져오는 것보다 훨씬 빠르더라고요! 마치 여러 개의 탭을 동시에 열어놓고 작업하는 것과 같다고 생각하시면 될 것 같아요. 실제로 제가 썼던 코드를 보여드릴게요. 세 개의 웹사이트에서 데이터를 가져오는 예제인데요. (아래 코드 삽입) 이 코드를 보시면, fetch_data 함수가 각 웹사이트에서 데이터를 가져오는 역할을 하고, asyncio.gather 가 이 함수들을 동시에 실행하도록 도와주는 것을 볼 수 있을 거예요. asyncio.sleep(2) 는 네트워크 지연을 시뮬레이션하기 위해 넣...