본문 바로가기
C.W.K.
Stream
Lesson 04 of 12 · published

날짜와 시간 패턴

~8 min · date, time, iso8601

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

가능하면 ISO 8601을 사용해

입력 형식을 통제할 수 있다면 날짜는 YYYY-MM-DD, 날짜와 시간은 ISO 8601 형식으로 받아. 문자열의 기본 모양은 다음처럼 표현할 수 있어.

  • 날짜: \d{4}-\d{2}-\d{2}
  • 시간: \d{2}:\d{2}:\d{2}
  • 날짜와 시간: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?

모호한 형식은 정규식으로 해결할 수 없어

05/04/2026은 미국에서는 5월 4일이지만 다른 많은 지역에서는 4월 5일이야. 정규식은 어느 해석이 맞는지 알 수 없어. 입력 규칙을 ISO 8601로 정하거나, 허용할 형식과 지역을 명시해.

여러 형식을 꼭 받아야 한다면 각각의 형식을 별도 패턴으로 구분한 뒤 알맞은 파서에 넘겨.

1. ISO: \d{4}-\d{2}-\d{2}
2. 미국식 슬래시: \d{1,2}/\d{1,2}/\d{4}
3. 유럽식 점: \d{1,2}\.\d{1,2}\.\d{4}
4. 영문 월: (Jan|Feb|...)\s+\d{1,2},?\s+\d{4}

모양 검사와 날짜 검증은 달라

정규식은 형식만 검사하므로 2026-02-30도 매칭해. 실제로 존재하는 날짜인지는 Python의 datetime.strptime이나 Go의 time.Parse 같은 날짜 파서로 확인해야 해. JavaScript에서는 구성 요소를 파싱해 날짜를 만든 뒤 생성된 연·월·일이 입력과 같은지 비교하거나 엄격한 날짜 라이브러리를 사용해. !isNaN(new Date(s))만으로는 존재하지 않는 날짜가 다음 달로 정규화되는 경우를 놓칠 수 있어.

산문에서 날짜 후보 찾기

본문에서 날짜를 찾을 때는 \b(?:\d{4}-\d{2}-\d{2}|\d{1,2}/\d{1,2}/\d{4})\b처럼 허용할 모양을 좁혀서 추출해. 추출된 값은 다시 날짜 파서로 검증해야 해.

Code

날짜 패턴·python
import re
from datetime import datetime

# ISO 날짜의 모양 검사
DATE_ISO = re.compile(r'^\d{4}-\d{2}-\d{2}$')
bool(DATE_ISO.fullmatch('2026-05-04'))  # True
bool(DATE_ISO.fullmatch('2026/05/04'))  # False

# 모양을 확인한 뒤 실제 날짜로 파싱
def parse_iso_date(s):
    if not DATE_ISO.fullmatch(s):
        return None
    try:
        return datetime.strptime(s, '%Y-%m-%d').date()
    except ValueError:
        return None  # 2월 30일처럼 존재하지 않는 날짜

parse_iso_date('2026-05-04')  # date(2026, 5, 4)
parse_iso_date('2026-02-30')  # None — 모양은 맞지만 날짜는 잘못됨

# ISO 날짜·시간과 시간대
DT_ISO = re.compile(
    r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$'
)
bool(DT_ISO.fullmatch('2026-05-04T14:32:11Z'))           # True
bool(DT_ISO.fullmatch('2026-05-04T14:32:11.123+09:00'))  # True

# 산문에서 날짜 후보 찾기
DATE_FIND = re.compile(r'\b\d{4}-\d{2}-\d{2}\b')
re.findall(DATE_FIND, 'logged on 2026-05-04 and 2026-05-05')
# ['2026-05-04', '2026-05-05']

External links

Exercise

코드에서 날짜 패턴 하나를 골라 2026-13-012026-02-30으로 테스트해 봐. 정규식과 datetime.strptime이 각각 어느 오류를 잡는지 비교하고, 형식 검사는 어디까지 맡기고 실제 날짜 검증은 어디서 할지 정해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.