ToolActToolAct

유통기한 계산기

유통기한 계산, 제품 보관기간 관리

유통기한 계산기란?

유통기한 계산기는 제품의 유통기한을 계산하거나 생산일을 추정하는 온라인 도구입니다. 생산일과 보관기간을 입력하면 정확한 유통기한을 얻을 수 있고, 유통기한으로 생산일을 역산할 수 있습니다. 여러 제품 추가, 남은 일수 실시간 표시로 식품, 의약품, 화장품 기한 관리가 쉽습니다.

브라우저 로컬 실행, 데이터 업로드 없음, 개인정보 보호.

실제 기한 관리는 보관 온도, 개봉 여부, 제조사 표시 기준, 관련 법규에 따라 달라질 수 있습니다. 계산값은 재고 정리와 알림용 참고 자료로 사용하고 최종 판단은 제품 라벨을 확인해야 합니다.

사용 방법

사용 방법

  1. 계산 모드를 선택하세요: 생산일→유통기한 또는 유통기한→생산일
  2. 날짜와 유통기한 일수를 입력하세요
  3. 계산 버튼을 클릭하면 결과가 표시됩니다
  4. 제품 목록에 추가하여 일괄 관리하세요

결과 확인

  • 유통기한이 생산일, 포장일, 개봉일, 입고일 중 어디서부터 시작되는지 확인하세요. 이 기준은 서로 바꿔 쓸 수 없습니다.
  • 식품, 의약품, 규제가 적용되는 상품의 경우 인쇄된 라벨과 현지 규정을 최종 기준으로 삼으세요.

활용 사례

생산일과 보관기간으로 유통기한 계산생산일, 보관기간, 단위(일/월/년)를 입력하면 목표 유통기한, 남은 일수, 신선도 상태를 확인할 수 있습니다. 남은 일수 카운터는 브라우저의 현재 날짜를 기준으로 계산되므로 시계가 잘못된 기기에서는 시스템 시간이 교정될 때까지 잘못된 신선도 구간이 표시됩니다.
유통기한에서 생산일 역산모드를 전환하여 알려진 유통기한과 보관기간으로 생산일을 추정하세요. 패키지 라벨, 재고 기록, 배치 문서 확인 시 유용합니다. 나중에 계산을 이해할 수 있도록 보관기간 단위와 참조 날짜를 결과 옆에 기록하세요.
소규모 제품 워치리스트 유지이름이 지정된 결과를 페이지 내 목록에 추가하여 신선한 제품, 기한 임박 제품, 기한 초과 제품을 비교하세요. 월·년 보관기간은 각각 30일, 365일로 단순화되므로 규제 대상 상품은 공식 규정이 여전히 필요합니다. 알림은 브라우저 Notification API를 통해 발생하므로 최초 요청은 사이트별로 허용해야 하며 거부된 권한은 사용자가 사이트 설정에서 되돌리기 전까지 거부 상태로 유지됩니다.
월·년 보관기간 사용 시 주의페이지는 1개월을 30일, 1년을 365일로 처리하므로 '18개월 이내 최적' 라벨 제품은 패키지 인쇄와 며칠 차이가 날 수 있습니다. 규제 대상 상품은 폐기 전에 인쇄된 날짜와 교차 확인하세요. 조제분유, 혈액 제제, 처방 의약품 같은 규제 품목은 계산 추정치가 아닌 원본 패키지에 인쇄된 배치 코드를 요구하는 경우가 많습니다.
배치 목록으로 쇼핑 로테이션 계획팬트리나 의약품 항목을 한꺼번에 추가하고 남은 일수 알림으로 다음에 사용할 항목을 파악하세요. 페이지 내 목록은 localStorage에 저장되며 대부분의 브라우저는 오리진당 5~10MB로 제한하므로 대규모 개인 재고도 문제없이 작동합니다. localStorage가 가득 차면 페이지는 메모리 저장으로 폴백되며 저장된 목록은 리로드 시 사라지므로 수동으로 메모 파일에 내보내는 것이 안전한 방법입니다.

기술 원리

유통기한 계산은 생산일을 기준으로 한 정수 날짜 연산입니다. 정방향 경로는 Date.setDate(date.getDate() + n)으로 expiry = production + shelf_life_days를 계산하며, 이 함수는 월과 년 롤오버를 네이티브로 처리합니다(예: 2025-01-31 + 30 = 2025-03-02, 2월은 28일이므로). 역방향 경로도 같은 방식으로 production = expiry - shelf_life_days를 계산합니다. DST(서머타임) 전환 시 자정 근처의 시간 이동을 방지하기 위해, 이 페이지는 Date.UTC(y, m, d)를 사용하여 UTC 기준으로 연산을 고정하고 정수 밀리초(n * 86400000)를 더합니다. 로컬 시간의 Date.setDate은 DST 경계를 넘을 때 1시간 오프셋이 발생하여 미국의 3월과 11월, EU의 10월 전환 시 표시 날짜가 뒤바뀔 수 있습니다. 보관기간 단위는 덧셈 전에 일수로 정규화됩니다. 1개월은 30일, 1년은 365일로 처리하며, 대부분의 소비자 포장지에 사용되는 휴리스틱이지만 규제 기관이 사용하는 달력 정확한 규칙과는 다릅니다. Codex Alimentarius 포장식품 라벨링 일반기준(CXS 1-1985, 개정판)과 중국의 GB 7718-2025는 제조일 또는 포장일로부터의 보관기간을 규정합니다. 의약품 유효기간은 ICH Q1A(R2) 안정성 시험 가이드라인을 따르며, 인쇄된 유효기간을 해당 월의 마지막 날로 반올림합니다(따라서 2024-08-15에 제조되어 18개월 보관기간인 의약품은 2026-02-15가 아닌 2026-02-28로 표기됩니다). 남은 일수 카운터는 (expiry_utc - now_utc) / 86400000으로, 이미 경과한 일수는 Math.floor, 남은 시간은 Math.ceil로 반올림하며, 신선도 구간은 임계값 비교입니다: 남은 일수 < 0이면 기한 초과, 0 <= 남은 일수 <= 30이면 기한 임박, 그 외는 정상. 지속 가능한 워치리스트는 window.localStorage에 단일 네임스페이스 키로 저장되며 JSON.stringify로 직렬화됩니다. 대부분의 브라우저는 오리진당 약 5~10MB로 제한합니다(Chrome 약 10MB, Safari 약 5MB). 할당량을 초과하면 브라우저는 name이 'QuotaExceededError'인 DOMException을 throw하며, throw 이후의 쓰기는 무시되므로 메모리 상태로 폴백해야 합니다. localStorage는 동기식이며 동일 출처이므로 항목은 페이지 리로드 시 유지되지만 기기를 벗어나지 않습니다. 리마인더에서 사용하는 브라우저 Notification API는 Notification.requestPermission()이 필요하며, 오리진별로 허용해야 합니다. Windows 86 이상의 Chrome에서는 실제로 브라우저 자체가 아닌 OS 알림 센터를 통해 표시됩니다.

  • 날짜 연산: Date.setDate(d.getDate() + n)은 월/년 롤오버를 네이티브로 처리하지만, 로컬 시간에서는 DST 경계를 넘어 날짜가 뒤바뀔 수 있음; Date.UTC + 정수 ms가 안전한 경로.
  • 단위 정규화: 1개월 약 30일, 1년 약 365일 - 단순하지만 달력 정확하지 않음; 의약품 라벨은 ICH Q1A(R2)를 따르고 유효 월의 마지막 날로 반올림.
  • 남은 일수 = Math.floor((expiry_utc - now_utc) / 86400000); 임계값: 남은 일수 < 0 -> 기한 초과, 0 <= 남은 일수 <= 30 -> 기한 임박, 그 외 정상.
  • 규제 기준은 상이: 식품 보관기간은 Codex CXS 1-1985 / GB 7718-2025(제조일 또는 포장일부터); 화장품은 PAO(개봉 후 기간)를 첫 사용부터 적용; 의약품은 ICH Q1A 안정성 기한 사용.
  • 개봉 후 보관기간은 인쇄된 유효기간과 무관하며 더 짧음(예: 개봉한 올리브 오일 약 3개월, 밀봉 시 24개월 보관기간); 개봉일을 별도로 추적해야 함.
  • localStorage 할당량은 오리진당 약 5~10MB이며 가득 차면 QuotaExceededError(DOMException)를 throw; throw 이후의 쓰기는 무시되므로 setItem을 try/catch로 감싸고 사용자에게 경고 표시.
  • 브라우저 시계 오차(잘못 설정된 시스템 날짜)는 신선도 구간을 이동시킴; 페이지는 원격 시간 소스가 아닌 new Date()를 읽으므로 클라이언트 측 시계 오류를 그대로 계승.

예시

생산일 2026-01-01 + 730일 = 2027-12-31

모드: 생산일 -> 유통기한
생산일: 2026-01-01
유통기한: 730일 (2년)
만료일: 2027-12-31
상태: 유통기한 이내

의약품: 18개월 유통기한

약품 배치 번호: A26-0215
생산일: 2026-02-15
유통기한: 18개월 (약 548일)
만료일: 2027-08-15
라벨 참고 - 의약품 관행: 해당 월의 마지막 날에 만료되도록 표기하므로
인쇄된 날짜는 2027-08-31로 표시될 수 있습니다

역계산: 만료일 -> 생산일

모드: 만료일 -> 생산일
포장에 인쇄된 만료일: 2028-06-30
유통기한: 36개월
생산일 (이전 또는 동일): 2025-06-30
공급업체가 주장하는 생산일을 배치 라벨과 대조하여
검증할 때 사용합니다.

식품 보관 점검

품목: 올리브 오일 500ml
생산일: 2025-12-01
유통기한: 24개월
만료일: 2027-12-01
점검:  유통기한 이내; FIFO 방식으로 재고를 회전시키고 만료 약 30일 전에 할인 계획

자주 묻는 질문

유통기한은 어떻게 계산되나요?

제조일 + 기간 = 유통기한입니다. 기간은 일, 주, 개월, 연 단위로 입력할 수 있습니다. 개월을 더할 때는 대상 월의 마지막 날에 맞춰 클램핑됩니다(예: 1월 31일 + 1개월 = 2월 28/29일). 이는 대부분의 규제 기관이 '제조일로부터 N개월'을 해석하는 방식과 일치합니다.

남은 일수는 오늘을 기준으로 계산되나요?

네. 사용자의 로컬 시간대 기준으로 오늘부터의 남은 일, 주, 개월 수를 표시합니다. 음수는 이미 유통기한이 지났음을 의미합니다. 상태 라벨(신선 / 임박 / 만료)을 통해 빠르게 분류할 수 있습니다.

품질 유지 기한과 소비 기한의 차이는 무엇인가요?

품질 유지 기한(Best-before)은 품질에 관한 날짜로, 지나도 안전하게 먹을 수는 있지만 풍미나 식감이 떨어질 수 있습니다. 소비 기한(Use-by)은 안전에 관한 날짜로, 지나면 건강에 위협이 될 수 있습니다. 화장품과 의약품은 'PAO'(개봉 후 사용 기한) 기호를 갖는 경우가 많아, 개봉 후에는 인쇄된 유통기한보다 PAO가 우선 적용됩니다.

보관 환경도 결과에 반영되나요?

아니요. 인쇄된 유통기한은 제조사가 권장하는 보관 조건(서늘하고 건조하며 밀폐, 냉장 또는 냉동)을 가정합니다. 열, 습도, 빛은 실제 보존 기간을 단축하지만 본 도구는 이를 모델링하지 않습니다. 계산된 날짜는 상한선으로 받아들이세요.

유통기한이 지난 식품이나 약품은 어떻게 처리해야 하나요?

개봉하지 않은 통조림이나 마른 식자재는 품질 유지 기한이 약간 지나도 보통 괜찮으니 외관과 냄새로 확인하세요. 유제품, 육류, 생선이 소비 기한을 넘겼다면 폐기하세요. 의약품은 유통기한이 지나면 효능이 떨어질 수 있고 일부는 위험하므로 중요한 치료에 의존하지 마세요.

여러 제품을 한 번에 추적할 수 있나요?

탭을 추가로 열어 사용하시면 됩니다. 각 탭은 독립적으로 동작합니다. 본 페이지는 재고 정보를 저장하지 않으므로 지속적인 관리가 필요하다면 재고 관리 앱이나 간단한 스프레드시트가 더 적합합니다.

입력한 데이터가 업로드되나요?

아니요. 모든 계산은 브라우저에서 실행되며 세션 간에 저장되지 않습니다.