MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

ICS 캘린더 검사기

캘린더 가져오기가 실패하거나 일정이 밀리는 이유를, 파일 속 위치를 가리키는 줄 번호와 함께 찾아봅니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

iCalendar(.ics) 텍스트

23줄471byte

검사 결과

검토 필요
일정3
시간대0
오류5
경고5
  • 오류

    PARSE · ICAL

    이 줄은 올바른 콘텐츠 줄(NAME:value)이 아닙니다.

  • 오류

    DTEND_BEFORE_START · DTEND

    DTEND는 DTSTART보다 뒤여야 합니다.

  • 오류

    UID_DUPLICATE · UID

    앞선 일정이 이미 쓴 UID입니다. 일정마다 고유한 UID를 주세요.

  • 오류

    UID_MISSING · UID

    이 일정에 UID가 없습니다. 캘린더 앱은 UID로 같은 일정을 알아봅니다.

  • 오류

    DATE_INVALID · DTSTART

    올바른 iCalendar 날짜나 날짜·시간이 아닙니다(YYYYMMDD 또는 YYYYMMDDTHHMMSS).

  • 경고

    PRODID · PRODID

    PRODID 속성을 추가하세요. 많은 가져오기 도구가 기대합니다.

  • 경고

    LINE_ENDINGS · FORMAT

    CRLF 줄 끝이 없거나 섞여 있습니다. RFC 5545는 CRLF를 요구하며 대부분의 앱은 LF도 받지만 엄격한 앱은 거부합니다.

  • 경고

    TZID_UNKNOWN · DTSTART

    이 TZID에 맞는 VTIMEZONE이 파일에 없어 앱이 일정을 엉뚱한 시각에 놓을 수 있습니다. VTIMEZONE을 추가하거나 UTC를 쓰세요.

  • 경고

    TZID_UNKNOWN · DTEND

    이 TZID에 맞는 VTIMEZONE이 파일에 없어 앱이 일정을 엉뚱한 시각에 놓을 수 있습니다. VTIMEZONE을 추가하거나 UTC를 쓰세요.

  • 경고

    RRULE_INVALID · RRULE

    RRULE을 확인하세요. FREQ=DAILY, WEEKLY, MONTHLY, YEARLY 뒤에 올바른 매개변수가 와야 합니다.

이 ICS 검사기는 iCalendar 파일을 읽어 캘린더 가져오기 도구가 중시하는 구조 규칙을 검사합니다. UID가 없거나 종료가 시작보다 앞서는 것 같은 오류와, 정의 없이 참조된 시간대 같은 경고를 관련 속성, 그리고 해당하는 경우 파일의 줄 번호와 함께 보고합니다. 구글 캘린더, 아웃룩, 애플 캘린더가 .ics 파일을 애매한 메시지로 거부하거나 시각을 틀리게 가져올 때 원인을 찾는 데 알맞습니다.

검사는 RFC 5545(인터넷 캘린더링 및 스케줄링 핵심 객체 명세)를 따르고 텍스트가 바뀔 때마다 다시 실행되므로, 편집기에서 한 줄을 고치면 해당 결과가 사라지는 것을 바로 볼 수 있습니다. 검사기는 보고만 합니다. 완전히 같은 중복 일정, 빠진 PRODID, LF 줄 끝처럼 기계적으로 고칠 수 있는 문제라면 ICS 복구 도구가 고치고 남은 문제를 보여 줍니다.

입력한 내용은 브라우저 안에서 처리되며 서버로 전송되지 않고, 캘린더 URL을 가져오는 일도 없습니다. 크기 한도는 5 MiB입니다.

사용 방법

  1. 캘린더 열기 또는 붙여 넣기

    파일 열기를 누르거나 .ics 파일을 편집기에 끌어다 놓거나 텍스트를 붙여 넣습니다. 올바른 캘린더, 문제 있는 캘린더, 매년 생일 칩으로 예제를 먼저 볼 수 있습니다. 5 MiB를 넘는 파일은 받지 않습니다.

  2. 요약 읽기

    텍스트가 바뀌면 바로 검사합니다. 배지에 가져올 수 있음 또는 검토 필요가 표시되고, 일정, 시간대, 오류, 경고 네 가지 개수가 나옵니다.

  3. 결과 하나씩 확인하기

    결과는 오류가 먼저, 그다음 줄 순서로 정렬됩니다. 각 결과에는 코드, 관련 속성, 고치는 방법을 담은 문장이 있고, 줄 버튼을 누르면 편집기가 그 줄로 이동합니다. 오류가 난 줄은 편집기에도 표시됩니다. 줄 버튼이 없는 결과는 파일 전체에 해당합니다.

  4. 원본 고치기

    가능하면 캘린더를 내보낸 앱에서 오류를 고치고, 아니면 이 편집기에서 직접 고치면서 개수가 바뀌는 것을 확인하세요. 경고는 거부가 아니라 위험 신호입니다.

  5. 보고서 복사 후 가져오기 시험

    보고서 복사를 누르면 상태를 적은 첫 줄과 결과마다 한 줄씩인 텍스트가 클립보드에 담겨 버그 티켓이나 동료에게 보낼 수 있습니다. 오류가 0이 되면 실제 캘린더보다 먼저 임시 캘린더에서 가져오기를 시험하세요.

작동 원리

가장 작은 유효한 캘린더

iCalendar 객체는 VERSION:2.0과 PRODID 속성을 가진 VCALENDAR 구성 요소이며 그 안에 VEVENT 등의 구성 요소가 들어갑니다. 각 VEVENT에는 식별용 UID, 객체 생성 시각을 기록하는 DTSTAMP, DTSTART가 있어야 합니다. 종료는 DTEND 또는 DURATION으로 주며 둘 중 하나만 씁니다. 줄 끝은 CRLF이고 75옥텟보다 긴 내용 줄은 다음 줄을 공백이나 탭으로 시작해 접습니다.

검사기는 먼저 줄 접기를 풀어 접힌 속성도 올바르게 읽고, 줄 번호는 원본 텍스트 기준으로 보고합니다. 마지막으로 파일 전체를 ical.js 파서에 넘겨 보고, 파서가 읽지 못하면 줄 번호 없는 PARSE 결과를 더합니다.

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example//EN
BEGIN:VEVENT
UID:one@example.test
DTSTAMP:20270101T000000Z
DTSTART:20270301T090000Z
DTEND:20270301T100000Z
SUMMARY:One
END:VEVENT
END:VCALENDAR

도구가 낼 수 있는 결과

오류는 파일이 거부되거나 잘못 읽힐 가능성이 큰 경우로, 하나라도 있으면 배지가 검토 필요로 바뀝니다. 경고는 위험 신호일 뿐이라 배지는 가져올 수 있음으로 남습니다. 표는 모든 코드와 심각도를 보여 줍니다.

코드심각도의미
EMPTY, SIZE_LIMIT오류입력이 없거나 파일이 5 MiB보다 큼
PARSE오류NAME:value 형식이 아닌 줄이 있거나 파일 전체가 파싱되지 않음
WRAPPER, STRUCTURE오류파일이 BEGIN:VCALENDAR로 시작하지 않거나 BEGIN과 END 블록이 맞지 않음
VERSION, NO_EVENTS오류VERSION:2.0이 없거나 VEVENT가 없음
UID_MISSING, UID_DUPLICATE오류일정에 UID가 없거나 뒤 일정이 같은 UID와 RECURRENCE-ID 조합을 다시 씀
DTSTAMP_MISSING, DTSTART_MISSING오류필수 속성이 없음
DATE_INVALID, DTEND_INVALID오류날짜나 날짜-시간이 잘못되었거나 실제 존재하지 않는 날짜
DTEND_BEFORE_START오류둘의 값 종류와 시간대 형식이 같을 때 DTEND가 DTSTART보다 뒤가 아님
PRODID, LINE_ENDINGS경고PRODID가 없거나 CRLF 대신 LF나 CR만 사용
TZID_UNKNOWN경고TZID 매개변수에 맞는 VTIMEZONE이 파일에 없음
RRULE_INVALID경고RRULE 형식이 잘못됐거나 RFC 5545의 일곱 FREQ 값 중 하나가 없음

시간대, 줄 끝, 그리고 검사하지 않는 것

DTSTART;TZID=Asia/Seoul:20270301T090000 같은 속성은 시간대를 이름으로 참조합니다. RFC 5545는 같은 파일에 해당 TZID의 VTIMEZONE이 있기를 기대합니다. VTIMEZONE 없이 IANA 이름만 있어도 받아 주는 앱이 많지만 시각을 부유 시각으로 보는 앱도 있어서 도구가 경고합니다.

줄 끝은 원본 그대로일 때만 판단할 수 있습니다. 파일 열기나 끌어다 놓기로 연 파일과 내장 예제는 CRLF나 LF를 그대로 유지하므로 LINE_ENDINGS를 검사합니다. 편집기에 붙여 넣은 텍스트는 브라우저가 이미 LF로 바꿔 버렸기 때문에 이 검사를 건너뛰고, 편집기 아래에 그 사실을 알려 줍니다.

검사기는 DURATION, DTSTART와 DTEND 사이의 DATE와 DATE-TIME 혼용, FREQ 값 이외의 RRULE 구성 요소의 의미, ATTENDEE 주소, METHOD, 알림을 검사하지 않습니다. 깨끗한 보고서는 구조가 건전하다는 뜻이지 모든 세부 사항이 맞다는 뜻이 아닙니다.

실제 예시

문제없는 캘린더
입력
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//t//EN
BEGIN:VEVENT
UID:a@x
DTSTAMP:20270101T000000Z
DTSTART:20270301T090000Z
DTEND:20270301T100000Z
SUMMARY:One
END:VEVENT
END:VCALENDAR
출력
가져올 수 있음
일정 1 · 시간대 0 · 오류 0 · 경고 0
문제를 찾지 못했습니다.

줄 끝이 CRLF인 파일로 연 경우입니다. 같은 텍스트를 붙여 넣어도 결과는 같습니다. 붙여 넣은 텍스트는 줄 끝 검사를 건너뛰기 때문입니다.

UID 중복과 뒤바뀐 시각, 복사한 보고서
입력
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//t//EN
BEGIN:VEVENT
UID:a@x
DTSTAMP:20270101T000000Z
DTSTART:20270301T090000Z
DTEND:20270301T100000Z
SUMMARY:One
END:VEVENT
BEGIN:VEVENT
UID:a@x
DTSTAMP:20270101T000000Z
DTSTART:20270301T090000Z
DTEND:20270301T080000Z
SUMMARY:Two
END:VEVENT
END:VCALENDAR
출력
ICS 검사 보고서: 검토 필요
[오류] 줄 12: 앞선 일정이 이미 쓴 UID입니다. 일정마다 고유한 UID를 주세요.
[오류] 줄 15: DTEND는 DTSTART보다 뒤여야 합니다.

보고서 복사로 클립보드에 담기는 텍스트입니다. 두 번째 일정이 첫 일정의 UID를 다시 쓰고 종료가 시작보다 한 시간 앞섭니다. 줄 번호는 파일의 첫 줄부터 셉니다.

존재하지 않는 날짜와 정의되지 않은 시간대
입력
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//t//EN
BEGIN:VEVENT
UID:b@x
DTSTAMP:20270101T000000Z
DTSTART;TZID=Asia/Seoul:20270230T090000
DTEND;TZID=Asia/Seoul:20270301T100000
RRULE:COUNT=3
END:VEVENT
END:VCALENDAR
출력
오류  DATE_INVALID   · DTSTART  줄 7
경고  TZID_UNKNOWN   · DTSTART  줄 7
경고  TZID_UNKNOWN   · DTEND    줄 8
경고  RRULE_INVALID  · RRULE    줄 9

2월 30일은 없는 날짜이고, TZID에 맞는 VTIMEZONE이 파일에 없으며, RRULE에는 FREQ가 없습니다. 같은 줄에 경고가 있어도 오류가 먼저 나옵니다.

LF 줄 끝과 VERSION 누락
입력
BEGIN:VCALENDAR
BEGIN:VEVENT
UID:c@x
DTSTAMP:20270101T000000Z
DTSTART:20270301T090000Z
DTEND:20270301T100000Z
SUMMARY:One
END:VEVENT
END:VCALENDAR
출력
오류  VERSION       · VERSION
경고  PRODID        · PRODID
경고  LINE_ENDINGS  · FORMAT   줄 1

LF 줄 끝으로 저장된 파일을 연 경우입니다. VERSION과 PRODID는 파일 전체에 대한 결과라 줄 버튼이 없습니다. 같은 텍스트를 붙여 넣으면 앞의 두 결과만 나옵니다.

자주 하는 실수

  • 깨끗한 보고서가 가져오기 성공을 보장하지는 않음

    캘린더 앱마다 고유한 특성과 한도가 있습니다. 실제 데이터를 건드리기 전에 임시 캘린더로 가져와 일정 수, 시각, 반복을 확인하세요.

  • DTEND가 DTSTART와 같으면 오류

    시간 지정 일정에서 종료가 시작보다 늦지 않으면 보고됩니다. 종일 일정의 DTEND는 포함되지 않는 날짜이므로 하루짜리 일정은 다음 날로 끝나야 합니다. DTSTART;VALUE=DATE:20270301에는 DTEND;VALUE=DATE:20270302입니다.

  • VTIMEZONE 없는 TZID

    Asia/Seoul 같은 이름은 VTIMEZONE 없이도 동작하는 앱이 많지만 전부는 아니며, 그 결과 부유 시각이나 밀린 시각이 됩니다. VTIMEZONE을 넣거나 UTC로 내보내세요.

  • UID 중복이 항상 실수는 아님

    반복 일정의 예외 회차는 시리즈와 같은 UID를 쓰고 RECURRENCE-ID로 구분됩니다. 검사기는 각 예외 회차의 RECURRENCE-ID가 고유하면 허용하고, 같은 UID와 RECURRENCE-ID 조합이 반복될 때만 UID_DUPLICATE를 보고합니다.

  • 붙여 넣으면 줄 끝 정보가 사라짐

    브라우저의 입력 상자는 줄바꿈을 모두 LF로 바꾸므로, 붙여 넣은 캘린더로는 원본이 CRLF였는지 알 수 없습니다. 엄격한 가져오기 도구가 줄 끝을 문제 삼는다면 붙여 넣지 말고 .ics 파일을 직접 여세요. 그래야 LINE_ENDINGS 경고가 실제 파일을 반영합니다.

자주 묻는 질문

오류와 경고는 무엇이 다른가요?

오류는 필수 요소가 없거나 잘못되어 가져오기 도구가 파일을 거부하거나 잘못 읽을 가능성이 큰 경우이며, 하나라도 있으면 배지가 검토 필요가 됩니다. 경고는 동작할 수 있지만 시간대 참조에 정의가 없는 것처럼 위험이 있는 경우입니다.

이 검사기가 파일을 고쳐 주나요?

아니요. 보고만 하지만, 편집기에서 텍스트를 고치면 결과가 바로 바뀌는 것은 볼 수 있습니다. 완전히 같은 중복 일정 제거, PRODID 추가, 줄 끝을 CRLF로 바꾸기 같은 기계적 수정은 ICS 복구 도구를 쓰세요.

UID 중복이 왜 오류인가요?

캘린더 클라이언트는 UID와 RECURRENCE-ID로 시리즈와 예외 회차를 식별합니다. 마스터와 서로 다른 예외 회차는 UID를 공유해도 되며, 같은 반복 회차 식별자가 다시 쓰일 때만 UID_DUPLICATE가 뒤의 UID 줄을 가리킵니다.

파일을 붙여 넣었더니 줄 끝 경고가 사라졌어요. 왜 그런가요?

붙여 넣은 텍스트는 원래 줄바꿈을 잃어서 검사해도 의미가 없으므로 건너뛰고, 편집기 아래에 그 사실을 알려 줍니다. 줄 끝까지 검사하려면 파일 열기를 누르거나 파일을 끌어다 놓으세요.

반복 규칙도 깊이 검사하나요?

NAME=value 조각은 어떤 순서든 받으며 FREQ가 SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY 중 하나인지 확인합니다. 형식만 검사하고 규칙이 만들 날짜는 계산하지 않습니다.

캘린더 URL을 검사할 수 있나요?

아니요. 제공한 파일이나 텍스트만 읽고 URL은 가져오지 않습니다. 먼저 .ics 파일을 내려받은 뒤 여기서 여세요.

캘린더가 업로드되나요?

아니요. 입력한 내용은 브라우저 안에서 처리되며 서버로 전송되지 않습니다. 화면에는 줄 번호와 속성 이름이 붙은 결과만 표시되고, 복사한 보고서에도 그 밖의 내용은 들어가지 않습니다.

마지막 업데이트: