근래 타임스탬프를 사용할 일이 많아서 아래의 사이트를 자주 이용하고 있었다.
https://www.epochconverter.com/
필요한 기능만 딱 있고 매우 편리한 사이트이지만...
역시 웹사이트에 접속해야 한다는 것 자체가 나에겐 매우 큰 귀찮음으로 다가왔기 때문에, 이를 봇에 올렸다.
1. 클래스 작성
당연히 메인 봇에 코드를 다 때려 넣으면 정신 사나우니 별도의 클래스로 관리한다.
from datetime import datetime
from math import trunc
import time
class Epoch:
# Convert Datetime to Timestamp
def ConvertTime(year, month, day, hour, min, sec):
try:
srcTime = f'{year}-{month}-{day} {hour}:{min}:{sec}'
detStamp = time.mktime(datetime.strptime(srcTime, '%Y-%m-%d %H:%M:%S').timetuple())
# Drop point
detStamp = trunc(detStamp)
except:
print("Wrong Datetime Input")
detStamp = 0
return detStamp
# Convert Timestamp to formatted string
def ConvertStamp(stamp):
try:
detTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(stamp))
except:
print("Something went wrong while processing ConvertStamp()!!")
detTime = 0
return detTime
연월일 시분초 입력을 받고 이를 타임스탬프로 변환하는 함수와,
타임스탬프를 받고 이를 연월일 시분초로 포맷된 스트링으로 변환하는 함수를 준비했다.
나중에 다른 기능도 필요할 수 있지만 지금은 이거면 된다.
2. 명령어 작성
이제 메인 봇 코드에 명령어를 작성할 시간이다.
@client.tree.command()
@app_commands.describe(year='연도', month='월', day='일', hour='시', min='분', sec='초')
async def cvtime(interaction: discord.Interaction, month: app_commands.Range[int, 1, 12], day: app_commands.Range[int, 1, 31],
hour: app_commands.Range[int, 0,23 ], min: app_commands.Range[int, 0, 59],
year: app_commands.Range[int, 0, 9999]=None, sec: app_commands.Range[int, 0, 59]=None):
"""Datetime을 Timestamp로 변환. 24시간 포맷으로 입력할 것."""
# As default, using current year
if(year == None):
year = datetime.datetime.today().year
# 0 Second is default argument
if(sec == None):
sec = 0
detStamp = ep.ConvertTime(year, month, day, hour, min, sec)
# Exception Handling
if(detStamp == 0):
await interaction.response.send_message("처리 중 문제가 생겼어요. 날짜 및 시간을 제대로 확인해 주세요.")
else:
srcTime = ep.ConvertStamp(detStamp)
await interaction.response.send_message(f'Convert Datetime "{srcTime}" to Timestamp\n{detStamp}', ephemeral=True)
@client.tree.command()
@app_commands.describe(srcstamp='타임스탬프')
async def cvstamp(interaction: discord.Interaction, srcstamp: int):
"""Timestamp를 Datetime으로 변환."""
detTime = ep.ConvertStamp(srcstamp)
# Exception Handling
if(detTime == 0):
await interaction.response.send_message("처리 중 문제가 생겼어요. 제대로 된 스탬프를 입력했나요?")
else:
await interaction.response.send_message(f'Convert Timestamp "{srcstamp}" to Datetime\n{detTime}', ephemeral=True)
cvtime()의 입력은 범위를 일일이 지정해 줬다.
mktime()에서 범위를 검사하지만, 입력 단계에서 필터링을 해줘야 별다른 처리 없이 편하게 사용할 수 있을 것이다.
연과 초는 옵션으로 두었다. 연도는 지금의 해가 가장 많이 쓰일 것이고, 초도 0초가 가장 많이 사용될 것이기 때문.
cvstamp()는 정말 별거 없다. 음수 타임스탬프를 막기 위한 범위 지정은 하지 않았지만,
이는 strftime()이 알아서 예외처리해 줄 것이다.
이제 봇을 켜서 확인해 보자.
3. 동작 확인
1. cvtime()
먼저 cvtime()을 확인한다.
자신이 시간을 제대로 입력했는지 확인하기 위해 Datetime 형식으로 출력하는 것도 잘 동작한다.
2. cvstamp()
cvstamp()는 어떨까.
위의 스탬프에서 숫자만 살짝 바꿔서 입력했다.
문제없이 잘 변환해 준다.
4. 마무리
필요할 때마다 하나씩 소소한 기능들을 추가하고 있지만, 역시 봇 메인 코드에 명령어를 때려 박는 건 상당히 잘못됐다.
처음 시작을 잘못한 것의 대가는 크다.
빠른 시일 내에 방법을 찾아서 분리를 해 놓는 게 미래의 나에게도 좋을 것 같다.
'Study > Python' 카테고리의 다른 글
[Python, AWS] csv에서 DynamoDB에로의 교체 (0) | 2023.05.10 |
---|---|
[Python] 로깅 클래스 추가 (0) | 2023.04.03 |
[Python] 디스코드 봇에 환율 확인 기능 추가 (0) | 2023.02.12 |
[Python] 봇의 명령어 실행 결과를 csv 형식으로 저장하기 (0) | 2023.01.22 |
[Python] CLOUDTYPE으로 디스코드 봇 배포 (0) | 2023.01.17 |