För att räkna kalenderdagar mellan publiceringsdatum jämför du deras kalenderdatum i stället för att dividera förflutna timmar med 24. På en Mac hanterar Numbers indata som bara innehåller datum; tidsstämplar måste först tolkas i en vald tidszon.

Den här guiden använder syntetiska publiceringsdatum och den gregorianska kalendern. Uppgiften är att svara på frågan ”Hur många kalenderdagar skiljer det mellan de här två publikationerna?” Standardräkningen är en signerad differens: samma datum ger noll och följande datum ger ett.

Vilken typ av datumuppgifter har du?

Välj indatatyp innan du räknar. Ett datum som står tryckt på en publikation och en tidsstämpel som anger när den släpptes kräver olika förberedelser.

Indata Betydelse Förberedelse
2025-03-09 Ett kalenderdatum: år, månad och dag Jämför direkt med ett annat gregorianskt kalenderdatum
2025-03-09T05:00:00Z En tidsstämpel som identifierar ett ögonblick Konvertera till ett datum i den valda rapporteringstidszonen
-05:00 En UTC-förskjutning Anger tidsskillnaden från UTC på ett visst ögonblick
America/New_York En namngiven tidszon Tillhandahåller reglerna för att tolka lokala datum och ändringar av UTC-förskjutning

En UTC-förskjutning och en namngiven tidszon innehåller olika slags information. Förskjutningen som hör till en tidsstämpel beskriver inte förskjutningen ett annat datum. En namngiven tidszon tillhandahåller regler för det förhållandet, inklusive sommartidsomställningar. Den här skillnaden förklaras uttryckligen i RFC 9557, ”Date and Time on the Internet: Timestamps with Additional Information”.

För ett kalkylark med publiceringsdatum bör du fastställa följande regel: behåll datum som redan har angetts som kalenderdatum; härled datum från tidsstämplar med hjälp av en uttryckligen vald rapporteringstidszon. Lägg inte till ett godtyckligt midnattstidvärde och en UTC-förskjutning till ett datum som saknar tid bara för att kunna subtrahera det.

Kalenderstandarder skiljer också mellan datum och datum-tider. iCalendar-standarden definierar ett separat värde DATE som innehåller kalenderkomponenter. Den serialiserade formen använder siffror utan avskiljare; de bindestrecksförsedda datumen i den här guiden är till för läsbarhet. Se RFC 5545, avsnitt 3.3.4.

Varför fungerar det inte att dividera förflutna sekunder med 86 400?

En differens mellan kalenderdatum mäter hur långt kalendern har gått framåt. En differens mellan förfluten tid mäter intervallet mellan två ögonblick. Vid en sommartidsomställning behöver dessa storheter inte motsvara 24 timmar per steg i datumet. RFC 5545 påpekar uttryckligen att en nominell upprepning var dag kan vara kortare eller längre än 24 timmar när en tidszonsförskjutning sker. Se diskussionen om upprepningar.

Betrakta två syntetiska publiceringsintervall i America/New_York. Beräkningarna nedan använder lokal midnatt vid varje ändpunkt. UTC-förskjutningarna följer New Yorks regler för tidszon och omställningar i IANA:s tidszonsdatabas.

Syntetiskt publiceringsintervall UTC-förskjutning vid start UTC-förskjutning vid slut Förflutna timmar Differens mellan kalenderdatum
9–10 mars 2025 -05:00 -04:00 23 1
2–3 november 2025 -04:00 -05:00 25 1

För marsintervallet är motsvarande UTC-ögonblick 2025-03-09T05:00:00Z och 2025-03-10T04:00:00Z: 23 timmar från varandra. Dividerar man det intervallet med 24 får man ungefär 0.9583. För novemberintervallet ger motsvarande beräkning ungefär 1.0417. Inget av decimalvärdena besvarar kalenderfrågan.

Avrundning kan dölja felet i de här exemplen, men den ger ingen tillförlitlig räkneregel. Två publikationer klockan 23.55 och 00.05 på varsin sida om midnatt ligger bara tio minuter från varandra och har ändå en differens mellan kalenderdatum på ett. Ta först fram datumen och beräkna sedan differensen.

Hur räknar du publiceringsdatum i Numbers?

Använd den här metoden när du redan har de avsedda publiceringsdatumen. Apple beskriver DAYS(end-date, start-date) som en funktion som returnerar antalet dagar mellan argumenten, inklusive ett negativt resultat när slutdatumet infaller före startdatumet. Se referensen för Numbers DAYS.

Öppna ett Numbers-kalkylark med en tom tabell. Använd rad 1 för beskrivande etiketter och skriv sedan in följande formler var för sig på rad 2. Om du vill ange en formel markerar du dess cell, skriver det inledande =, fyller i uttrycket och trycker på Retur. Det här är Apples dokumenterade steg för att ange formler i Numbers på Mac.

Cell Förslag på kolumnetikett Formel att ange Förväntat värde
A2 Tidigare publiceringsdatum =DATE(2025,3,9) 9 mars 2025
B2 Senare publiceringsdatum =DATE(2025,3,10) 10 mars 2025
C2 Dagar mellan kalenderdatumen =DAYS(B2,A2) 1

Med DATE skapas indata från år, månad och dag i stället för att förlita sig på hur en tvetydig textsträng tolkas. Apple rekommenderar den här funktionen för konsekvent datumentolkning mellan olika datumformatinställningar i sin lista över datum- och tidsfunktioner.

Upprepa kontrollen på rad 3 med =DATE(2025,11,2) i A3, =DATE(2025,11,3) i B3 och =DAYS(B3,A3) i C3. Svaret är återigen 1. Du jämför de angivna kalenderdatumen, så ingen justering för förflutna timmar behövs.

Om du vill göra en snabb beräkning utan hjälpceller anger du =DAYS(DATE(2025,3,10),DATE(2025,3,9)) i en tom cell. Det är enklare att granska och återanvända versionen med separata kolumner för flera publiceringspar.

Vill du ha mellanrummet eller ett inkluderande antal datum?

Standarddifferensen räknar inte startdatumet som en enhet. Det är en dag mellan 9 och 10 mars. Om du i stället vill veta hur många datum som ingår från och med 9 mars till och med 10 mars är svaret två.

För ett intervall där slutdatumet räknas med och ligger på eller efter startdatumet använder du =DAYS(B2,A2)+1. Kontrollera ordningen innan du använder formeln. En negativ differens är ett tecken på att posterna kan vara omkastade; om du automatiskt tar absolutbeloppet försvinner den informationen.

Samma skillnad gäller ett intervall med ett datum. Datumdifferensen är noll, medan det inkluderande antalet är ett. Bestäm vilket resultat kalkylarket behöver och namnge resultatkolumnen därefter.

Vad gör du om indata är tidsstämplar?

En tidsstämpel måste konverteras till rapporteringstidszonen innan du tar bort tidsdelen. Exempelvis motsvarar 2025-03-10T00:30:00Z den 9 mars klockan 20.30 i America/New_York, med datumets UTC-förskjutning -04:00. Om du kopierar tidsstämpelns första tio tecken väljer du UTC-datumet i stället för New York-datumet för publiceringen.

Den dokumenterade signaturen för Numbers DAYS tar emot två datumargument; den har inget argument för namngiven tidszon. Använd den när de avsedda datumen har fastställts. För en repeterbar beräkning från tidsstämplar på en Mac tillhandahåller Foundation de API:er för kalenderhantering som behövs.

Trots namnet representerar Foundations Date ett ögonblick oberoende av kalender och tidszon. Apple hänvisar kalenderberäkningar till Calendar. Se den officiella dokumentationen för Date.

Vid vanliga sommartidsomställningar går Foundation-sekvensen till så här: välj den gregorianska kalendern och rapporteringstidszonen, hitta början på varje ändpunkts lokala dag och begär sedan differensen med endast dagkomponenten. Apple dokumenterar både startOfDay(for:) och dateComponents(_:from:to:).

Kör ett komplett Foundation-exempel i Terminal

Den här frivilliga metoden kräver en installerad Swift-verktygskedja. Öppna Terminal och kör swift --version för att kontrollera detta, enligt beskrivningen i Swifts kom igång-guide. Vid behov beskriver Apple hur du installerar kommandoradsverktygen med xcode-select --install; slutför installationsdialogen innan du fortsätter. Se Installera kommandoradsverktygen.

Klistra in hela kodblocket nedan i Terminal. Det innehåller ett komplett program och syntetiska indata. Programmet tolkar tidsstämplar med uttryckliga UTC-förskjutningar och utan bråkdelar av sekunder. Apple dokumenterar .withInternetDateTime för det här tidsstämpelformatet i referensen för alternativen till ISO8601DateFormatter.

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

Förväntad utdata visas nedan. De numeriska exemplen kontrollerades separat med datumaritmetik; Swift-programmet granskades men kördes inte på macOS här.

Vår: 1 kalenderdag(ar), 23.0 förflutna timmar
Höst: 1 kalenderdag(ar), 25.0 förflutna timmar

Om du vill anpassa programmet byter du ut tidsstämpelsträngarna och väljer rapporteringstidszon medvetet. Tidsstämplarnas UTC-förskjutningar identifierar deras ögonblick; kalenderns tidszon avgör vilka lokala datum dessa ögonblick infaller på. Programmet avslutas om tolken rapporterar ett fel i stället för att ersätta det med dagens datum eller hoppa över en post.

Exemplet accepterar det angivna formatet med UTC-förskjutning. Bråkdelar av sekunder kräver andra tolkningsalternativ. Exemplet hanterar inte tidszonsannoteringar inom hakparenteser enligt RFC 9557: ange den namngivna tidszonen separat, som i exemplet, i stället för att anta att den här parserkonfigurationen stöder sådana annoteringar.

Vad bör du kontrollera när resultatet verkar fel?

Gör följande kontroller i ordning; var och en gäller en annan möjlig orsak till skillnaden.

  1. Bekräfta vad som ska räknas. En datumdifferens och ett inkluderande antal datum skiljer sig med ett för ett intervall framåt i tiden.
  2. Bekräfta indata. Använd faktiska värden för år, månad och dag för publikationer med datum utan tid. Anta inte att importerade tidsstämplar redan motsvarar avsedda lokala datum.
  3. Bekräfta rapporteringstidszonen. Konvertera båda ögonblicken med samma valda tidszon innan du tar fram datumen.
  4. Bekräfta beräkningen. Räkna kalenderdagar efter att påverkan från klockslaget tagits bort. Om du dividerar ett intervall mellan två ögonblick med 86,400 besvarar du en fråga om förfluten tid.
  5. Bekräfta riktningen. Behåll ett negativt resultat tills du har avgjort om de tidigare och senare posterna har bytt plats.

För kalenderkod bör du använda API:et för början av dagen i stället för att anta att varje lokal dag börjar vid en unik midnatt. Apple dokumenterar att startOfDay(for:) väljer den första midnatten om det finns två, eller det första ögonblicket som faktiskt existerar om midnatt saknas. Det hanterar ett gränsfall som kan missas om man ställer in klockslaget på noll manuellt. Se startOfDay(for:).

Foundation-exemplet hanterar vanliga sommartidsomställningar. För historiska ändringar som gör att en hel lokal dag hoppas över behöver du först ange om uppgiften räknar gregorianska datumetiketter eller lokala dagar som faktiskt existerade; kraven är olika. Behåll datum utan tid som kalenderetiketter när det förstnämnda avses.

För ett kalkylark med publiceringsdatum håller du den slutliga beräkningen enkel: fastställ de två avsedda gregorianska datumen, behåll deras ordning och använd DAYS för att hitta mellanrummet. Om indatan består av ögonblick anger du rapporteringstidszonen uttryckligen före beräkningen. Då förblir resultatet knutet till publiceringsdatumen även när klockan ställs om mellan dem.

Källor