Unixtime und Datumsfunktionen



  • Hallo!

    Ich benutze den C++ Builder 5 und bin nun auf ein Problem gestossen.

    Ich habe ein Datum X im Unixtime Format. Ausgehend von diesem Datum muss ich 2 Daten errechnen:

    - der 1. Tag des vorhergehenden Monats
    - der letzte Tag des vorhergehenden Monats

    Dabei sollen natürlich Schaltjahre und Jahreswechsel berücksichtig werden.

    Praktisch soll das so aussehen:

    X = 02.01.2006 (als unixtime)

    1. Datum: 01.12.2005
    2. Datum: 31.12.2005

    Leider komme ich mit den Funktionen von TDateTime nicht wirklich weiter.
    Hat jemand ne Idee oder ein Codeschnippsel?



  • Ich weiß nicht, ob es beim BCB 5 schon dabei ist...

    In der DateUtils gibt es die Funktionem

    UnixToDateTime // konvertiert Unix-Datumsangaben
    DaysInMonth    // gibt Anzahl der Tage im Monat -> letzter Tag im Monat
    IncMonth       // zum 'Rechnen' mit Monaten
    


  • Hallo und Danke!

    Aber leider gibts die Funktionen dort nicht! (Nur incmonth)



  • Also im BCB 6 geht es so:

    TDateTime datum=UnixToDateTime(1138880060);
    TDateTime erster=StartOfTheMonth(IncMonth(datum,-1));
    TDateTime letzter=EndOfTheMonth(IncMonth(datum,-1));
    

    Musst allerdings die DateUtils includen.



  • Das würde mich aber auch dringend interessieren, ich arbeite auch mit dem BCB 5.

    Ausgehend von der Überlegung, das der Timestamp sich errechnet aus 01.01.1970 + Sekunden bis jetzt, könnte man sicherlich auch so einen TimeStamp in einer Funktion errechnen.



  • Ja schon, aber wie siehts mit den Schaltjahren aus?



  • #include <dos.h>
    class unixtime
    {
    private:
    unsigned long unixtime;
    struct date datum;
    struct time zeit;
    void lastmonth()
    {
       unixtodos(unixtime,&datum,&zeit);
       datum.da_mon--;
       if(!datum.da_mon)
       {
          datum.da_mon = 12;
          datum.da_year--;
       }
    }
    public:
    void set_unixtime(unsigned long unti) {unixtime=unti;lastmonth();}
    unixtime(unsigned long unti) {unixtime=unti;lastmonth();}
    TDateTime get_erster()
    {
       return EncodeDate(datum.da_year,datum.da_mon,1);
    }
    TDateTime get_letzter()
    {
       short months[12]={31,28,31,30,31,30,31,31,30,31,30,31};
       return EncodeDate(datum.da_year,datum.da_mon,months[datum.da_mon-1]+isschaltjahr(datum.da_year));
    }
    bool isschaltjahr(int iJahr)
    {
        if (!(iJahr%4))
        {
          if (!(iJahr%100))
          {
             if (!(iJahr%400)) return true;
             else return false;
          }
          else return true;
        }
        else return false;
    }
    };
    

    und dann

    unsigned long uni=1206716131;
    unixtime letztermonat(uni);
    TDateTime erster = letztermonat.get_erstertag();
    TDateTime letzter = letztermonat.get_letztertag();
    

    geht bestimmt noch schöner zu machen. 😉



  • Wahnsinn!! Danke, genau das was ich gesucht habe. 🙂


Anmelden zum Antworten