Visualizzazione dei risultati da 1 a 6 su 6

Hybrid View

  1. #1
    Conviene convertire le date in Julian Day:

    codice:
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    double JulianDay(int year, int month, int day)
    {
        double retValue;
        double Y, M, D;
        double A, B;
        
        D = day;
        
        if ( month <= 2 )
        {
            Y = year - 1;
            M = month + 12;
        }
        else
        {
            Y = year;
            M = month;
        }
        
        A = (int)(Y/100);
        B = 2 - A + (int)(A/4);
        
        retValue = (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5;
        
        return retValue;
        
    }
    
    int main ()
    {
        int d1, m1, y1;
        int d2, m2, y2;
        
        double jd1, jd2;
        int diff;
        
        d1 = 5;
        m1 = 2;
        y1 = 1995;
        
        d2 = 31;
        m2 = 8;
        y2 = 2014;
        
        jd1 = JulianDay(y1, m1, d1);
        jd2 = JulianDay(y2, m2, d2);
        
        diff = (int)(jd2 - jd1);
        
        cout << endl;
        
        cout << "Data 1: " << d1 << "/" << m1 << "/" << y1 << endl;
        cout << "Data 2: " << d2 << "/" << m2 << "/" << y2 << endl;
        
        cout << "Differenza in giorni: " << diff << endl << endl;
            
        return 0;
    }

    Output:
    [vincenzo]$ g++ -Wall -W -pedantic -O2 jd.cpp -o jd
    [vincenzo]$ ./jd

    Data 1: 5/2/1995
    Data 2: 31/8/2014
    Differenza in giorni: 7147

    L'algoritmo è preso da Astronomical Algorithms di Jean Meeus.

  2. #2
    I Giulian Day Number sono utili anche per ottenere una data aggiungendo un certo numero di giorni a una data di partenza:

    codice:
    #include <cstdlib>
    #include <iostream>
    #include <cstring>
    #include <iomanip>
    
    using namespace std;
    
    double JulianDay(int year, int month, int day)
    {
        double retValue;
        double Y, M, D;
        double A, B;
        
        D = day;
        
        if ( month <= 2 )
        {
            Y = year - 1;
            M = month + 12;
        }
        else
        {
            Y = year;
            M = month;
        }
        
        A = (int)(Y/100);
        B = 2 - A + (int)(A/4);
        
        retValue = (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5;
        
        return retValue;
        
    }
    
    void CalendarDate(double jd, int *year, int *month, int *day)
    {
        double num = jd + 0.5;
        int Z = (int)num;
        double F = num - Z;    
        double A, B, C, D, E;
        int alpha;
        
        if ( Z < 2299161 )
        {
            A = Z;    
        }
        else
        {
            alpha = (int)( (Z - 1867216.25) / 36524.25 );
            A = Z + 1 + alpha - (int)(alpha / 4);
        }
        
        B = A + 1524;
        C = (int)( (B - 122.1) / 365.25 );
        D = (int)( 365.25 * C );
        E = (int)( (B - D) / 30.6001 );
        
        *day = B - D - (int)(30.6001 * E) + F;
        
        if ( E < 14 )
        {
            *month = E - 1;
        }
        else if ( E == 14 || E == 15 )
        {
            *month = E - 13;
        }
        
        if ( *month > 2 )
        {
            *year = C - 4716;
        }
        else if ( *month == 1 || *month == 2 )
        {
            *year = C - 4715;
        }
    }
    
    int DayOfTheWeek(double jd, char *strDay)
    {
        int num = (int)(jd + 1.5);
        int retValue = num % 7;
        
        switch ( retValue )
        {
            case 0:
                strcpy(strDay, "Domenica");
                break;
            case 1:
                strcpy(strDay, "Lunedì");
                break;
            case 2:
                strcpy(strDay, "Martedì");
                break;
            case 3:
                strcpy(strDay, "Mercoledì");
                break;
            case 4:
                strcpy(strDay, "Giovedì");
                break;
            case 5:
                strcpy(strDay, "Venerdi");
                break;
            case 6:
                strcpy(strDay, "Sabato");
                break;            
        }
        
        return retValue;    
    }
    
    int IsLeapYear(int year)
    {
        if ( year % 4 != 0 )
        {
            return 0;
        }
        else
        {
            if ( year % 100 != 0 )
                return 1;
            else if ( year % 400 != 0 )
                return 0;
            else
                return 1;            
        }
    }
    
    int DayOfTheYear(int year, int month, int day)
    {
        int N, K;
        
        K = IsLeapYear(year) ? 1 : 2;    
        
        N = (int)( (275 * month)/9 ) - K * (int)( (month + 9)/12 ) + day - 30;
        
        return N;
    }
    
    int main ()
    {
        int d1, m1, y1;
        int d2, m2, y2;
        
        int d3, m3, y3;    
        int d4, m4, y4;    
        
        double jd1, jd2, jd3, jd4;
        int diff;
        int addDays;
        int DayOfYear;
        
        char szDay[256];
        
        d1 = 5;
        m1 = 2;
        y1 = 1995;
        
        d2 = 31;
        m2 = 8;
        y2 = 2014;
        
        jd1 = JulianDay(y1, m1, d1);
        jd2 = JulianDay(y2, m2, d2);
        
        diff = (int)(jd2 - jd1);
        
        cout << endl;
        
        cout << "Data 1: " << d1 << "/" << m1 << "/" << y1 << endl;
        cout << "Data 2: " << d2 << "/" << m2 << "/" << y2 << endl;    
        cout << "Differenza in giorni: " << diff << endl << endl;
        
        CalendarDate(jd1, &y3, &m3, &d3);
        cout << std::setprecision(21) << "jd -> " << jd1 << " = " << d3 << "/" << m3 << "/" << y3 << endl << endl;
        
        
        d3 = 30;
        m3 = 6;
        y3 = 1954;    
        
        jd3 = JulianDay(y3, m3, d3);
        DayOfTheWeek(jd3, szDay);
        
        cout << d3 << "/" << m3 << "/" << y3 << " -> " << szDay << endl << endl;
        
        
        addDays = 89;    
        jd4 = jd3 + addDays;
        CalendarDate(jd4, &y4, &m4, &d4);
        DayOfTheWeek(jd4, szDay);
        DayOfYear = DayOfTheYear(y4, m4, d4);
        
        cout << d3 << "/" << m3 << "/" << y3 <<    " + " << addDays << " giorni = " << d4 << "/" << m4 << "/" << y4 << " " << szDay << "; " << DayOfYear << "° giorno dell'anno." << endl << endl;        
            
        return 0;
    }

    Output
    [vincenzo]$ g++ -Wall -W -pedantic -O2 jd.cpp -o jd
    [vincenzo]$ ./jd

    Data 1: 5/2/1995
    Data 2: 31/8/2014
    Differenza in giorni: 7147

    jd -> 2449753.5 = 5/2/1995

    30/6/1954 -> Mercoledì

    30/6/1954 + 89 giorni = 27/9/1954 Lunedì; 270° giorno dell'anno.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.