locked
Wie für einen Weltkalender DatumZeit <=> Zahl umwandeln definieren ? RRS feed

  • Frage

  • Hallo,

    weiß jemand, wie ich für einen fremden Kalender, der z.B (Tag=1-31, Monat=1-12, Jahr=1300-4500, Zeit <sentencetext xmlns="http://www.w3.org/1999/xhtml">00:00:00-23:59:59.997</sentencetext>) definiert ist, eine Zahl (13000101000000000-45001231235959) definieren kann, der eindeutig ist, kann beliebig in Datum <=> Zahl umgewandelt werden kann und der Zahl beliebige Jahr, Monat, Tag, Stunde, Minute, Sekunde, MilliSekunden addiert/Subtrahiert werden kann ?

    MFG


    • Bearbeitet ati.sah Freitag, 22. Juli 2016 07:48
    Mittwoch, 20. Juli 2016 13:15

Antworten

  • Hallo ati.sah,

    bau dir doch einfach zwei Methoden mit denen du die Konvertierung durchführen kannst. Anschließend kannst du immer mit dem DateTime arbeiten ohne mühsam irgendwelche Zahlen hoch und runder addieren.

            private string ConvertFromDate(DateTime datum)
            {
                return string.Format("{0}{1:00}{2:00}{3:00}{4:00}{5:00}{6:000}", datum.Year, datum.Month, datum.Day, datum.Hour, datum.Minute, datum.Second, datum.Millisecond);
            }
    
            private DateTime ConvertFromString(string datum)
            {
                // Z.B. 1300 01 01 00 00 00 000
                int jahr = int.Parse(datum.Substring(0, 4));
                int monat = int.Parse(datum.Substring(4, 2));
                int tag = int.Parse(datum.Substring(6, 2));
                int stunde = int.Parse(datum.Substring(8, 2));
                int minute = int.Parse(datum.Substring(10, 2));
                int sekunde = int.Parse(datum.Substring(12, 2));
                int millisekunde = int.Parse(datum.Substring(14, 3));
    
                return new DateTime(jahr, monat, tag, stunde, minute, sekunde, millisekunde);
            }


    Mittwoch, 20. Juli 2016 14:27
  • Hallo ati.sah,

    bitte nicht vergessen, der Datumstart ist eine andere oder weiß jemand wie der DatumZeit im Hintergrund berechnet wird, im Internet habe ich nicht passende Info gefunden ?

    gut, aber mir geht es darum für einen anderen Weltkalender ähnliches zu schreiben, mit fehlt es an Infos.

    Mir ist nicht klar welche Informationen dir fehlen. David Stania hat dir ein wunderbares Beispiel geliefert, die Informationen auf denen es beruht befinden sich in der Dokumentation, die ich verlinkt habe.

    Unter der Dokumentation zu datetime findest Du reichlich Informationen zur Umwandlung in die verschiedensten Kalender und darüber wie diese in Verbindung mit datetime zu nutzen sind.

    Du solltest die zur Verfügung gestellten Informationen nutzen und anschließend deine Frage konkretisieren. Wenn Du selbst nicht weißt was Du willst, kannst Du hier auch keine passenden Antworten bekommen.

    Gruß


    - Florian

    Donnerstag, 21. Juli 2016 12:55
  • Hallo,

    das steht da sehr wohl:

    If you are working with a ticks value that you want to convert to some other time interval, such as minutes or seconds, you should use the TimeSpan.TicksPerDay, TimeSpan.TicksPerHour, TimeSpan.TicksPerMinute, TimeSpan.TicksPerSecond, or TimeSpan.TicksPerMillisecond constant to perform the conversion. For example, to add the number of seconds represented by a specified number of ticks to the Second component of a DateTime value, you can use the expression dateValue.Second + nTicks/Timespan.TicksPerSecond.

    nichts weiter als die Anwendung der Grundrechenarten...

    Gruß Elmar

    Mittwoch, 27. Juli 2016 08:13
    Beantworter

Alle Antworten

  • Hallo ati.sah,

    das geht mit datetime.

    Gruß


    - Florian

    Mittwoch, 20. Juli 2016 13:37
  • Hallo,

    bitte nicht vergessen, der Datumstart ist eine andere oder weiß jemand wie der DatumZeit im Hintergrund berechnet wird, im Internet habe ich nicht passende Info gefunden ?

    mfg

    Mittwoch, 20. Juli 2016 13:43
  • Hallo ati.sah,

    bau dir doch einfach zwei Methoden mit denen du die Konvertierung durchführen kannst. Anschließend kannst du immer mit dem DateTime arbeiten ohne mühsam irgendwelche Zahlen hoch und runder addieren.

            private string ConvertFromDate(DateTime datum)
            {
                return string.Format("{0}{1:00}{2:00}{3:00}{4:00}{5:00}{6:000}", datum.Year, datum.Month, datum.Day, datum.Hour, datum.Minute, datum.Second, datum.Millisecond);
            }
    
            private DateTime ConvertFromString(string datum)
            {
                // Z.B. 1300 01 01 00 00 00 000
                int jahr = int.Parse(datum.Substring(0, 4));
                int monat = int.Parse(datum.Substring(4, 2));
                int tag = int.Parse(datum.Substring(6, 2));
                int stunde = int.Parse(datum.Substring(8, 2));
                int minute = int.Parse(datum.Substring(10, 2));
                int sekunde = int.Parse(datum.Substring(12, 2));
                int millisekunde = int.Parse(datum.Substring(14, 3));
    
                return new DateTime(jahr, monat, tag, stunde, minute, sekunde, millisekunde);
            }


    Mittwoch, 20. Juli 2016 14:27
  • Hallo,

    gut, aber mir geht es darum für einen anderen Weltkalender ähnliches zu schreiben, mit fehlt es an Infos.

    mfg

    Donnerstag, 21. Juli 2016 12:15
  • Hallo ati.sah,

    bitte nicht vergessen, der Datumstart ist eine andere oder weiß jemand wie der DatumZeit im Hintergrund berechnet wird, im Internet habe ich nicht passende Info gefunden ?

    gut, aber mir geht es darum für einen anderen Weltkalender ähnliches zu schreiben, mit fehlt es an Infos.

    Mir ist nicht klar welche Informationen dir fehlen. David Stania hat dir ein wunderbares Beispiel geliefert, die Informationen auf denen es beruht befinden sich in der Dokumentation, die ich verlinkt habe.

    Unter der Dokumentation zu datetime findest Du reichlich Informationen zur Umwandlung in die verschiedensten Kalender und darüber wie diese in Verbindung mit datetime zu nutzen sind.

    Du solltest die zur Verfügung gestellten Informationen nutzen und anschließend deine Frage konkretisieren. Wenn Du selbst nicht weißt was Du willst, kannst Du hier auch keine passenden Antworten bekommen.

    Gruß


    - Florian

    Donnerstag, 21. Juli 2016 12:55
  • Hallo, danke für die Infos.

    wie gesagt meine Frage lautet: wie wandle ich z.B dies und andere ineinander (nicht c# DateTime Methoden nutzen sondern wie wird er intern umgerechnet)

    tt.mm.jjjj hh:mm:ss:000 "22.07.2016 00:00:00.000" <=> "636047424000000000" um ?

    mfg




    • Bearbeitet ati.sah Freitag, 22. Juli 2016 08:39
    Freitag, 22. Juli 2016 07:47
  • Hallo,

    lesen bildet;) Lies die Dokumentation von System.DateTime wie es Florian bereits empfohlen hat, dann erklärt sich der Rest von selbst:

    DateTime date = new DateTime(2016, 7, 22); // 22.07.2016 00:00:00: 636047424000000000 Ticks Console.WriteLine($"{date}: {date.Ticks} Ticks");

    Gruß Elmar

    Freitag, 22. Juli 2016 08:10
    Beantworter
  • Morgen,

    aus der empfohlenen Seite ist leider nicht zu sehen, wie ich aus den Ticks-Zahl den J, M, T, H, M, S, MS berechnen und auch umgekehrt kann.

    mfg

    Dienstag, 26. Juli 2016 05:26
  • Hallo,

    Morgen,

    aus der empfohlenen Seite ist leider nicht zu sehen, wie ich aus den Ticks-Zahl den J, M, T, H, M, S, MS berechnen und auch umgekehrt kann.

    mfg

    Selbstverständlich steht das da, denn zur Datetime Eigenschaft Ticks steht dort:
    "Der Wert dieser Eigenschaft stellt die Anzahl der 100-Nanosekunden-Intervalle, die seit 12:00:00 Mitternacht, 1. Januar 0001 verstrichen sind (0: 00:00 UTC am 1. Januar 0001, im gregorianischen Kalender)"


    - Florian


    Dienstag, 26. Juli 2016 07:17
  • Hallo,

    aus "Ticks" kannst du direkt ein DateTime erstellen:

    DateTime datum = new DateTime(Ticks);

    hier noch ein konkretes Beispiel:

    DateTime Datum = DateTime.Now;
    //......
    int Jahr = Datum.Year;
    int Monat = Datum.Month;
    int Tag = Datum.Day;
    int Stunde = Datum.Hour;
    int Minute = Datum.Minute;
    int Sekunde = Datum.Second;
    int MilliSekunde = Datum.Millisecond;
    //.....
    DateTime Datum1 = new DateTime(Jahr, Monat, Tag, Stunde, Minute, Sekunde, MilliSekunde);
    //......
    long Ticks = Datum.Ticks;
    DateTime Datum2 = new DateTime(Ticks);
    Debug.Assert(Datum == Datum1, $"{Datum.Ticks} # {Datum1.Ticks}"); // meistens ein Fehler
    Debug.Assert(Datum == Datum2); // immer richtig
    Console.WriteLine($"{Datum}  {Datum1}  {Datum2}");
    Console.ReadKey();

    Gruß


    • Bearbeitet K. Pater Dienstag, 26. Juli 2016 07:45
    Dienstag, 26. Juli 2016 07:43
  • Hallo,

    vielen dank, aber es interessiert mich aus der Ticks <=> DatumZeit manuell zu rechnen (nicht über C# DateTime Funktionen) ?

    mfg

    Dienstag, 26. Juli 2016 13:29
  • Hallo,

    so eine Funktion ist komplex die du nicht so einfach in einem Forum findest. das muss du dir schon selbst erarbeiten.

    Außerdem würde keiner der mit C# o.ä arbeitet auf die Idee kommen das Datum selbst zu berechen, dafür hat man DateTime.

    Bei AVR Entwickler mit C wirst du mehr glück haben.

    Schau mal hier

    Da ist ein Funktion für Unix Timestamp

    Gruß

    Thomas



    Dienstag, 26. Juli 2016 16:47
  • Hallo ati.sah,

    wie schon bemerkt wurde, bietet c# ja die Möglichkeit, Ticks in Datum und umgekehrt darzustellen. Ich unterstelle mal, du hast einen guten Grund dafür, das Rad neu zu erfinden. Hier ein Beispiel für Datum => Ticks, damit solltest du dann den umgekehrten Weg erarbeiten können.

    int jahr = 2016; int monat = 7; int tag = 26; int stunde = 19; int minute = 21; int sekunde = 58; int millisekunde = 219; int alle400Jahre = (int)Math.Floor(Convert.ToDouble(jahr - 1) / 400D); int säkularJahre = (int)Math.Floor(Convert.ToDouble(jahr - 1) / 100D); int schaltJahre = (int)Math.Floor(Convert.ToDouble(jahr - 1) / 4D) - säkularJahre + alle400Jahre; int nichtSchaltJahre = jahr - schaltJahre - 1;

    int tage = schaltJahre * 366 + nichtSchaltJahre * 365; int[] tageDesJahres = new int[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; bool istSchaltjahr = (jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0; tage += tageDesJahres[monat - 1] + (istSchaltjahr ? 1 : 0) + tag - 1; long tpd = 864000000000L; long tph = 36000000000L; long tpm = 600000000L; long tps = 10000000L; long tpms = 10000L; long calcTicks = (tage) * tpd + stunde * tph + minute * tpm + sekunde * tps + millisekunde * tpms; TimeSpan vergleich = new TimeSpan(new DateTime(jahr, monat, tag, stunde, minute, sekunde, millisekunde).Ticks); Console.WriteLine($"Jahr {jahr.ToString().PadLeft(4, '0')} Tage: {vergleich.Days - tage} = {vergleich.Days} - {tage}"); Console.WriteLine($"Jahr {jahr.ToString().PadLeft(4, '0')} Ticks: {vergleich.Ticks - calcTicks} = {vergleich.Ticks} - {calcTicks}"); Console.ReadKey();

    So richtig komplex ist das nicht, es gilt lediglich die 3 Regeln für die Berechnung der Schaltjahre zu beachten. Ebenfalls solltest du daran denken, dass die "Kalenderzählung" mit "1" beginnt.

    Die ersten Zeilen legen das Datum fest, die nächsten 4 Zeilen bestimmen die Anzahl Jahre und Schaltjahre, die nächsten 4 Zeilen die Anzahl Tage vom Beginn an...

    tp... steht für TicksPro...

    Hoffe, du kannst was damit anfangen :-)

    Gruß

    Dienstag, 26. Juli 2016 18:38
  • Hallo,

    das steht da sehr wohl:

    If you are working with a ticks value that you want to convert to some other time interval, such as minutes or seconds, you should use the TimeSpan.TicksPerDay, TimeSpan.TicksPerHour, TimeSpan.TicksPerMinute, TimeSpan.TicksPerSecond, or TimeSpan.TicksPerMillisecond constant to perform the conversion. For example, to add the number of seconds represented by a specified number of ticks to the Second component of a DateTime value, you can use the expression dateValue.Second + nTicks/Timespan.TicksPerSecond.

    nichts weiter als die Anwendung der Grundrechenarten...

    Gruß Elmar

    Mittwoch, 27. Juli 2016 08:13
    Beantworter