매달 말일 반복 일정, '매월 31일'로 정하면 생기는 일
요약 캘린더 표준(iCalendar, RFC 5545)을 그대로 따르면 '매월 31일' 반복은 31일이 없는 달(2·4·6·9·11월)을 건너뜁니다. 1년에 7번만 돌아오는 셈이에요. 매달 마지막 날에 챙길 일이라면 반복을 '그 달의 마지막 날'로 정하거나, 짧은 달에는 말일로 당겨 주는 앱을 쓰는 것이 안전해요. 어떤 앱을 쓰든 반복을 만든 뒤 2월과 4월 달력을 한 번 넘겨 보세요.
달마다 날수가 다르다
반복 일정이 빠지는 이유는 단순해요. 달마다 마지막 날이 다르기 때문이에요.
| 날수 | 해당하는 달 |
|---|---|
| 31일 | 1·3·5·7·8·10·12월 (7개월) |
| 30일 | 4·6·9·11월 (4개월) |
| 28일 (윤년에는 29일) | 2월 |
그래서 '매월 n일'로 만든 반복이 1년에 몇 번 돌아오는지는 n에 따라 달라져요.
| 반복 | 그 날짜가 없는 달 | 1년에 돌아오는 횟수 |
|---|---|---|
| 매월 28일 | 없음 | 12번 |
| 매월 29일 | 평년의 2월 | 11번 (윤년 12번) |
| 매월 30일 | 2월 | 11번 |
| 매월 31일 | 2·4·6·9·11월 | 7번 |
2026년과 2027년은 평년이라 2월이 28일까지이고, 다음 윤년은 2028년이에요.
표준 규칙은 없는 날짜를 '무시'한다
여러 캘린더 앱이 일정을 주고받을 때 쓰는 형식이 iCalendar이고, 반복 규칙은 그 표준 문서인 RFC 5545의 3.3.10절이 정해요. 이 절은 반복 규칙이 2월 30일처럼 존재하지 않는 날짜를 만들면 그 회차는 무시하고, 반복 횟수에도 세지 않는다고 적고 있어요.
같은 절의 예시가 바로 이 상황이에요. 매월 15일과 30일에 반복하는 규칙(BYMONTHDAY=15,30)은 1월에 15일·30일, 2월에는 15일 하루, 3월에 다시 15일·30일을 만들어요. 2월 30일은 조용히 사라지는 거예요.
즉 '매월 31일'을 표준대로 계산하면 짧은 달은 오류가 아니라 정상 동작으로 비게 돼요. 알림도 함께 오지 않으니, 관리비나 카드값처럼 말일에 챙겨야 하는 일이라면 한 달을 통째로 놓칠 수 있어요.
'말일'을 정확히 표현하는 두 가지 방법
표준 안에는 말일을 뜻하는 방법이 따로 있어요.
- 끝에서부터 세기 — RFC 5545는
BYMONTHDAY에 음수를 허용하고, 음수는 달의 끝에서부터 센다고 정해요.BYMONTHDAY=-1이 그 달의 마지막 날이에요. - 후보 중 마지막 고르기 —
BYSETPOS=-1은 한 주기 안의 후보 가운데 마지막 것을 골라요. 표준 문서는 "그 달의 마지막 평일"을FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1로 표현하는 예를 들어요. 같은 방식으로BYMONTHDAY=28,29,30,31;BYSETPOS=-1이라고 쓰면 "28~31일 중 그 달에 있는 마지막 날", 곧 말일이 돼요.
다만 대부분의 앱은 이런 규칙을 직접 입력받지 않고 화면의 선택지로 만들어요. 반복 설정에 '마지막 날'이나 '말일' 같은 선택지가 있는지 먼저 찾아보고, 없다면 아래 점검을 꼭 해 두세요.
말일 반복을 놓치지 않는 점검 목록
- 반복을 만든 직후 2월, 4월 달력을 넘겨 일정이 있는지 확인해요.
- 29일·30일 반복도 2월에는 같은 문제가 생겨요. 월급날·정산일처럼 날짜가 29~31일이면 함께 확인해요.
- 돈이 나가는 날(관리비·카드 결제일·자동이체)이 주말이나 공휴일이면 실제 처리일이 바뀔 수 있어요. 기관마다 직전 영업일 또는 다음 영업일로 처리하니, 이용하는 은행·카드사·관리사무소 안내를 확인해요.
- 다른 캘린더로 옮기거나
.ics파일로 주고받을 때는 옮긴 쪽에서도 짧은 달 일정을 한 번 더 확인해요. 같은 규칙 문자열이라도 앱마다 화면에 그리는 방식이 다를 수 있어요.
돌아옴(Doraom)에서는
돌아옴은 "매월 31일"이라고 적었을 때 2월을 빼라는 뜻으로 쓰는 사람은 없다고 보고, 짧은 달에는 그 달의 마지막 날로 당겨요.
- 한 줄 입력에
매월 31일 관리비라고 적으면 매달 반복 일정이 되고, 31일이 없는 달에는 30일(2월은 28일 또는 29일)에 표시돼요.매달 30일,매월 29일도 같은 규칙이에요. 저장되는 규칙은 위에서 본BYMONTHDAY=28,29,30,31;BYSETPOS=-1꼴이에요. - 항목의 반복 설정에서는 매일·매주(요일 여러 개)·매월(n일)·매년을 고르고, 간격(2로 두면 격주·격월)과 끝(끝없이·날짜까지·횟수)을 정할 수 있어요. 매월 29~31일도 같은 말일 규칙을 따라요.
매월 31일 관리비 25만원처럼 금액을 함께 적으면 납부 일정이 돼요. '휴일인 경우'를 다음 영업일·직전 영업일·그대로 중에서 고르면, 날짜가 토요일·일요일·공휴일일 때 실제 출금일을 함께 보여 줘요.- 달력에는 한국 공휴일이 함께 표시돼요.
참고한 자료
- RFC 5545 — Internet Calendaring and Scheduling Core Object Specification (iCalendar), 3.3.10 Recurrence Rule
- RFC 5545 — 3.8.5.3 Recurrence Rule, 2월 30일이 무시되는 예시
돌아옴(Doraom)으로 챙기기
한 줄로 적으면 날짜·반복·금액을 읽어 오늘 목록과 달력에 넣고, 제때 알려 줘요. 기본 기능은 무료예요.