4 Stimmen

Wie berechnet man die Anzahl der Tage zwischen zwei gegebenen Daten? (Schaltjahr-Hindernis)

  • Jedes Jahr, das gleichmäßig durch 400 teilbar ist, ist ein Schaltjahr (z. B. war 2000 ein Schaltjahr).
  • Jedes andere Jahr, das durch 100 teilbar ist, ist kein Schaltjahr (z. B. waren die Jahre 1700, 1800 und 1900 keine Schaltjahre).
  • Jedes andere Jahr, das durch 4 teilbar ist, ist ein Schaltjahr (z. B. 1996 und 2004 sind Schaltjahre).

Aber ich bin mir nicht sicher, wie ich in meinem C-Programm verschachtelte if-Zustände erstellen kann, die die richtige Antwort liefern würden...

13voto

Rap Punkte 6671

Konvertieren Sie beide in UNIX-Epochenzeit und subtrahieren Sie die Differenz.

UNIX Epoch time ist die Gesamtzahl der Sekunden für ein Datum seit dem 1. Januar 1970 00:00:00.0

Sobald Sie die Anzahl der Sekunden ermittelt haben, teilen Sie diese Differenz durch die Anzahl der Sekunden pro Tag (das ist 24 Stunden * 60 Minuten * 60 Sekunden = 86400 Sekunden ).

2voto

Stefano Borini Punkte 132313

Ich würde die beiden Daten in Julianischer Tag und dann den Unterschied machen, aber ich müsste erst prüfen, ob das eine gute Lösung ist, die keine Nachteile hat. Ich empfehle Ihnen, dasselbe zu tun.

2voto

Jonathan Leffler Punkte 694013

Finden Sie eine der Bibliotheken, die Daten in "Anzahl der Tage seit einer bestimmten Epoche" umrechnet (oft als julianischer Tag bezeichnet - obwohl es offizielle Regeln für die astronomische Julian Datum y Geändertes julianisches Datum ). Konvertieren Sie dann jedes Datum in die entsprechende Zahl, und nehmen Sie die Differenz. Wenn die Bibliothek mit Schaltjahren zurechtkommt, gilt das auch für Ihre Antwort.

Ideen für eine solche Reihe von Codes finden Sie unter ' Kalendarische Berechnungen '.

1voto

shufler Punkte 903

Schaltjahr-Algorithmus aus wikipedia:

Pseudocode 1:

if year modulo 400 is 0 then leap
 else if year modulo 100 is 0 then no_leap
 else if year modulo 4 is 0 then leap
 else no_leap

Pseudocode 2:

function isLeapYear (year):
  if ((year modulo 4 is 0) and (year modulo 100 is not 0)) or (year modulo 400 is 0)
   then true
  else false

1voto

Christoph Punkte 157217
#include <time.h>
#define SECONDS_PER_DAY (24 * 60 * 60)

time_t time_from_date(int year, unsigned month, unsigned day)
{
    return mktime(&(struct tm){
        .tm_year = year - 1900, .tm_mon = month - 1, .tm_mday = day });
}

int days_between(int year0, unsigned month0, unsigned day0,
    int year1, unsigned month1, unsigned day1)
{
    return difftime(time_from_date(year1, month1, day1),
        time_from_date(year0, month0, day0)) / SECONDS_PER_DAY;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X