게시 날짜 사이의 달력 날짜 수를 세려면 경과 시간을 24로 나누지 말고 각 날짜를 비교하세요. Mac의 Numbers는 날짜만 입력된 값을 처리합니다. 타임스탬프는 먼저 선택한 시간대에서 해석해야 합니다.
이 가이드에서는 합성 게시 날짜와 그레고리력을 사용합니다. 여기서 답하려는 질문은 “이 두 게시물의 날짜는 며칠 차이인가요?”입니다. 기본 계산은 부호가 있는 차이입니다. 날짜가 같으면 0이고, 다음 날짜면 1입니다.
어떤 종류의 날짜 정보가 있나요?
계산하기 전에 입력 유형을 선택하세요. 게시물에 인쇄된 날짜와 게시 시점을 기록한 타임스탬프는 서로 다른 준비가 필요합니다.
| 입력 | 의미 | 준비 방법 |
|---|---|---|
2025-03-09 |
민간 날짜: 연, 월, 일 | 다른 그레고리력 민간 날짜와 직접 비교 |
2025-03-09T05:00:00Z |
특정 순간을 나타내는 타임스탬프 | 선택한 보고 시간대의 날짜로 변환 |
-05:00 |
UTC 오프셋 | 특정 순간의 현지 시간과 UTC 간 차이를 나타냄 |
America/New_York |
명명된 시간대 | 현지 날짜와 오프셋 변경을 해석하는 데 필요한 규칙 제공 |
오프셋과 명명된 시간대는 서로 다른 정보를 담습니다. 한 타임스탬프에 붙은 오프셋으로는 다른 날짜의 오프셋을 알 수 없습니다. 명명된 시간대는 일광 절약 시간제 변경을 포함해 이런 관계를 설명하는 규칙을 제공합니다. 이 구분은 RFC 9557, “인터넷상의 날짜 및 시간: 추가 정보가 포함된 타임스탬프”에 명시되어 있습니다.
게시 날짜 스프레드시트에는 다음 규칙을 적용하세요. 민간 날짜로 제공된 날짜는 그대로 유지하고, 타임스탬프에서는 명시적으로 선택한 하나의 보고 시간대를 사용해 날짜를 도출합니다. 계산을 위해 날짜만 있는 값에 임의의 자정과 오프셋을 붙이지 마세요.
달력 표준에서도 날짜와 날짜-시간을 구분합니다. iCalendar 표준은 달력 구성 요소를 담는 별도의 DATE 값을 정의합니다. 직렬화된 형식은 구분 기호 없이 숫자를 사용하며, 이 가이드의 하이픈이 포함된 날짜는 읽기 편하도록 표기한 것입니다. RFC 5545 3.3.4절을 참조하세요.
경과 시간을 86,400으로 나누면 왜 안 되나요?
민간 날짜 차이는 달력에서 날짜가 얼마나 지났는지를 나타냅니다. 경과 시간 차이는 두 순간 사이의 간격을 나타냅니다. 일광 절약 시간제 전환을 걸치면 날짜가 하루 늘어날 때마다 24시간이 경과하는 것은 아닐 수 있습니다. RFC 5545는 시간대가 전환되면 명목상 하루 간격의 반복 주기가 24시간보다 짧거나 길 수 있다고 명시합니다. 반복 주기에 관한 설명을 참조하세요.
America/New_York 시간대의 합성 게시 날짜 쌍 두 개를 살펴보겠습니다. 아래 계산은 각 끝점의 현지 자정을 사용합니다. 오프셋은 IANA 시간대 데이터베이스의 뉴욕 시간대 및 전환 규칙을 따릅니다.
| 합성 게시 기간 | 시작 오프셋 | 종료 오프셋 | 경과 시간 | 달력 날짜 차이 |
|---|---|---|---|---|
| 2025년 3월 9~10일 | -05:00 |
-04:00 |
23 | 1 |
| 2025년 11월 2~3일 | -04:00 |
-05:00 |
25 | 1 |
3월 쌍에 해당하는 UTC 순간은 2025-03-09T05:00:00Z와 2025-03-10T04:00:00Z이며, 간격은 23시간입니다. 이 간격을 24로 나누면 약 0.9583이 됩니다. 11월 쌍에 같은 계산을 적용하면 약 1.0417가 됩니다. 두 소수 값 모두 달력상의 질문에 대한 답이 아닙니다.
이 예에서는 반올림으로 오류가 드러나지 않을 수 있지만, 그렇다고 신뢰할 수 있는 계산 규칙이 되는 것은 아닙니다. 연속된 날짜의 오후 11시 55분과 오전 12시 5분에 게시된 두 게시물은 실제 간격이 10분에 불과하지만 민간 날짜 차이는 여전히 1입니다. 먼저 날짜를 추출한 다음 차이를 계산하세요.
Numbers에서 게시 날짜를 어떻게 계산하나요?
원하는 게시 날짜가 이미 있다면 이 방법을 사용하세요. Apple 설명에 따르면 DAYS(end-date, start-date)은 인수 사이의 일수를 반환하며, 종료 날짜가 시작 날짜보다 앞서면 음수도 반환합니다. Numbers의 DAYS 참조 자료를 참조하세요.
빈 표가 있는 Numbers 스프레드시트를 여세요. 1행에는 설명용 레이블을 입력하고, 2행의 각 셀에 아래 수식을 하나씩 입력합니다. 수식을 입력하려면 셀을 선택하고 앞에 =을 입력한 뒤 식을 완성하고 Return을 누릅니다. 이는 Apple이 문서화한 Mac용 Numbers 수식 입력 단계입니다.
| 셀 | 권장 열 레이블 | 입력할 수식 | 예상 값 |
|---|---|---|---|
A2 |
앞선 게시 날짜 | =DATE(2025,3,9) |
2025년 3월 9일 |
B2 |
나중 게시 날짜 | =DATE(2025,3,10) |
2025년 3월 10일 |
C2 |
날짜 차이 | =DAYS(B2,A2) |
1 |
DATE을 사용하면 모호한 텍스트 문자열이 어떻게 해석되는지에 의존하지 않고 연, 월, 일로 입력값을 구성할 수 있습니다. Apple은 날짜 및 시간 함수 목록에서 날짜 형식 설정이 달라도 일관되게 해석할 수 있도록 이 함수를 권장합니다.
3행에서 =DATE(2025,11,2)을 A3에, =DATE(2025,11,3)을 B3에, =DAYS(B3,A3)을 C3에 넣어 다시 확인하세요. 답은 다시 1입니다. 제공된 달력 날짜를 비교하므로 경과 시간을 조정할 필요가 없습니다.
보조 셀 없이 빠르게 계산하려면 빈 셀 하나에 =DAYS(DATE(2025,3,10),DATE(2025,3,9))을 입력하세요. 열을 나누는 방식은 여러 게시 날짜 쌍에 다시 적용하기 쉽고 내용을 확인하기도 편합니다.
날짜 간격을 구하나요, 양 끝 날짜를 포함해 세나요?
일반적인 차이 계산에서는 시작 날짜를 계산 단위에 포함하지 않습니다. 3월 9일부터 3월 10일까지는 하루 차이입니다. 대신 3월 9일부터 3월 10일까지 날짜가 몇 개 포함되는지 묻는다면 답은 2입니다.
종료 날짜가 시작 날짜와 같거나 그 이후인 구간을 양 끝 날짜 모두 포함해 세려면 =DAYS(B2,A2)+1을 사용하세요. 이 수식을 적용하기 전에 날짜 순서를 확인하세요. 음수 차이는 항목 순서가 뒤바뀌었다는 유용한 단서입니다. 자동으로 절댓값을 취하면 그 정보가 사라집니다.
같은 구분은 날짜 하나만 있는 구간에도 적용됩니다. 날짜 차이는 0이지만, 양 끝을 포함해 세면 날짜가 하나입니다. 스프레드시트에 필요한 결과를 정하고 그에 맞게 결과 열 이름을 지정하세요.
입력값이 타임스탬프라면 어떻게 하나요?
타임스탬프에서 시간을 버리기 전에 보고 시간대로 변환해야 합니다. 예를 들어 2025-03-10T00:30:00Z는 해당 날짜의 -04:00 오프셋을 적용하면 America/New_York에서 3월 9일 오후 8시입니다. 타임스탬프의 앞 10자리를 복사하면 뉴욕 게시 날짜가 아니라 UTC 날짜가 선택됩니다.
문서화된 Numbers DAYS 시그니처는 날짜 인수 두 개를 받으며, 명명된 시간대 인수는 없습니다. 원하는 날짜를 확정한 다음 사용하세요. Mac에서 반복 가능한 타임스탬프 계산을 하려면 Foundation의 달력 API를 사용할 수 있습니다.
이름과 달리 Foundation의 Date는 달력이나 시간대와 무관한 순간을 나타냅니다. Apple은 달력 연산에 Calendar를 사용하도록 안내합니다. 공식 Date 문서를 참조하세요.
일반적인 일광 절약 시간제 전환을 처리할 때 Foundation으로 수행할 순서는 다음과 같습니다. 그레고리력 달력과 보고 시간대를 선택하고, 각 끝점의 현지 날짜가 시작되는 시점을 찾은 다음, 일 구성 요소만 사용해 차이를 요청합니다. Apple은 startOfDay(for:)과 dateComponents(_:from:to:) 모두를 문서화하고 있습니다.
Terminal에서 Foundation 전체 예제를 실행하세요
이 방법을 사용하려면 Swift 도구 체인이 설치되어 있어야 합니다. Swift 시작하기 가이드에 설명된 대로 Terminal을 열고 swift --version을 실행해 확인하세요. 필요한 경우 Apple에서 xcode-select --install을 사용한 명령어 라인 도구 설치 방법을 안내합니다. 계속하기 전에 설치 대화상자를 완료하세요. 명령어 라인 도구 설치를 참조하세요.
아래 블록 전체를 Terminal에 붙여넣으세요. 완전한 프로그램과 합성 입력 데이터가 포함되어 있습니다. 이 코드는 명시적 오프셋이 있고 소수 초가 없는 타임스탬프를 구문 분석합니다. Apple은 이 타임스탬프 형식에 ISO8601DateFormatter 옵션 참조의 .withInternetDateTime을 사용하도록 문서화하고 있습니다.
swift - <<'SWIFT'
import Foundation
let zoneID = "America/New_York"
guard let zone = TimeZone(identifier: zoneID) else {
fatalError("Unknown reporting zone: \(zoneID)")
}
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = zone
let parser = ISO8601DateFormatter()
parser.formatOptions = [.withInternetDateTime]
let samples = [
("Spring", "2025-03-09T00:00:00-05:00",
"2025-03-10T00:00:00-04:00"),
("Autumn", "2025-11-02T00:00:00-04:00",
"2025-11-03T00:00:00-05:00")
]
for (label, startText, endText) in samples {
guard let start = parser.date(from: startText),
let end = parser.date(from: endText) else {
fatalError("Could not parse timestamps for \(label)")
}
let startDay = calendar.startOfDay(for: start)
let endDay = calendar.startOfDay(for: end)
guard let days = calendar.dateComponents(
[.day], from: startDay, to: endDay
).day else {
fatalError("Could not calculate civil days for \(label)")
}
let hours = end.timeIntervalSince(start) / 3600
print("\(label): \(days) civil day(s), \(hours) elapsed hours")
}
SWIFT
예상 출력은 다음과 같습니다. 숫자 예시는 날짜 산술로 별도로 확인했으며, Swift 프로그램은 검토했지만 여기서는 macOS에서 실행하지 않았습니다.
봄: 달력상 1일, 경과 시간 23.0시간
가을: 달력상 1일, 경과 시간 25.0시간
프로그램을 조정하려면 타임스탬프 문자열을 바꾸고 보고 시간대를 신중하게 선택하세요. 타임스탬프의 오프셋은 순간을 식별하고, 달력의 시간대는 그 순간이 속하는 현지 날짜를 결정합니다. 구문 분석에 실패하면 프로그램은 현재 날짜를 대신 사용하거나 레코드를 건너뛰지 않고 중단합니다.
이 예제는 지정된 오프셋 포함 형식을 처리합니다. 소수 초에는 다른 파서 옵션이 필요합니다. RFC 9557의 대괄호로 묶인 시간대 주석도 구현하지 않습니다. 이 파서 구성에서 지원된다고 가정하지 말고, 예시처럼 명명된 시간대를 별도로 제공하세요.
결과가 잘못된 것 같을 때 무엇을 확인해야 하나요?
각각 다른 원인을 다루므로 다음 순서대로 확인하세요.
- 요청된 계산을 확인하세요. 날짜 차이와 양 끝 날짜를 포함한 날짜 수는 앞에서 뒤로 이어지는 구간에서 1만큼 다릅니다.
- 입력값을 확인하세요. 날짜만 있는 게시물에는 실제 연, 월, 일 값을 사용하세요. 가져온 타임스탬프가 이미 의도한 현지 날짜를 나타낸다고 가정하지 마세요.
- 보고 시간대를 확인하세요. 두 순간을 모두 같은 시간대로 변환한 다음 날짜를 추출하세요.
- 계산 방식을 확인하세요. 하루 중 시간을 제외한 뒤 달력 날짜를 세세요. 순간 사이의 간격을
86,400로 나누면 경과 시간에 관한 답이 나옵니다. - 방향을 확인하세요. 앞선 항목과 나중 항목의 순서가 바뀌었는지 확인할 때까지 음수 결과를 유지하세요.
달력 코드에서는 모든 현지 날짜가 하나의 고유한 자정에 시작한다고 가정하지 말고 하루 시작 시점 API를 사용하세요. Apple 설명에 따르면 startOfDay(for:)은 자정이 두 번 존재하면 첫 번째 자정을 선택하고, 자정이 없으면 존재하는 첫 순간을 선택합니다. 이 방식은 시간을 수동으로 0으로 설정하면 놓칠 수 있는 경계 조건을 처리합니다. startOfDay(for:)를 참조하세요.
Foundation 예제는 일반적인 일광 절약 시간제 변경을 다룹니다. 과거의 시간대 변경으로 현지 날짜 전체가 생략된 경우에는 먼저 달력상의 그레고리력 날짜 라벨을 세는지, 실제로 존재했던 현지 날짜를 세는지 명시하세요. 두 요구 사항은 서로 다릅니다. 전자를 의도한다면 날짜만 있는 입력을 달력 라벨로 유지하세요.
게시 날짜 스프레드시트에서는 최종 계산을 간단히 유지하세요. 의도한 두 그레고리력 날짜를 확정하고 순서를 유지한 다음 DAYS을 사용해 간격을 구하세요. 입력값이 특정 순간이라면 계산 전에 보고 시간대를 명시하세요. 이렇게 하면 두 날짜 사이에 시계가 바뀌어도 결과는 게시 날짜를 기준으로 합니다.
출처
DAYS — Apple.
Mac용 Numbers에서 표 셀의 데이터를 사용해 값 계산하기 — Apple.
범주별 함수 목록 — Apple.
RFC 5545: 인터넷 달력 및 일정 관리 핵심 객체 사양(iCalendar) — RFC Editor.
시간대 데이터베이스: northamerica — IANA.
Date — Apple.
startOfDay(for:) — Apple.
dateComponents(_:from:to:) — Apple.
formatOptions — Apple.
시작하기 — Swift.org.
명령어 라인 도구 설치 — Apple.