Datum UND Zeit in 32-bit Integer Variable speichern

    • Offizieller Beitrag

    Hi,
    Hintergrund hierfür war der Versuch, in einem ListView-Item mittels _GUICtrlListView_SetItemParam() Datum und Uhrzeit abzuspeichern, wobei die Uhrzeit mit Sekundenangabe gespeichert werden soll.
    Da als Speichergröße nur ein 32bit Integer zur Verfügung steht, fallen TimeToTicks und andere Varianten aus.

    Edit:
    Habe es auf progandys Tipp hin nun mit Unix-Timestamp realisiert. Somit ergibt sich ein verwendbarer Datumsbereich von 1902 - 2038.
    Das sollte i.A. ausreichen.

    Hier als Bsp. in einem ListView:

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate('test')
    $ListView = GUICtrlCreateListView('Testspalte', 10, 10, 200,200)
    GUICtrlCreateListViewItem("1", $ListView)
    GUICtrlCreateListViewItem("2", $ListView)
    GUICtrlCreateListViewItem("3", $ListView)
    $hListView = GUICtrlGetHandle($ListView)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Local $y = @YEAR, $mon = @MON, $d = @MDAY, $h = @HOUR, $m = @MIN, $s = @SEC
    _GUICtrlListView_SetItemParam($hListView, 1, _DateTimeToTimeStamp($y, $mon, $d, $h, $m, $s))
    MsgBox(0, 'Gesetztes Datum', $y & '/' & $mon & '/' & $d & ' ' & $h & ':' & $m & ':' & $s)
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $getItem = _TimeStampToDateTime(_GUICtrlListView_GetItemParam($hListView, 1))
    MsgBox(0, 'Gelesenes Datum', $getItem)
    ExitLoop
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; Limit: 1902 - 2038
    Func _DateTimeToTimeStamp($year, $mon, $day, $h, $m, $s)
    Return _DateDiff('s', "1970/01/01 00:00:00", $year & '/' & $mon & '/' & $day & ' ' & $h & ":" & $m & ":" & $s)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _TimeStampToDateTime($Number)
    Return _DateAdd('s', $Number, "1970/01/01 00:00:00")
    EndFunc

    [/autoit]
  • Das ist ein interessantes Zeit-Format ;)
    Du hättest doch auch EPOCH /Unix-timestamp verwenden können ;) 1970-2038 mit positiven Werten, kleiner als 1970 mit negativen Werten.
    Oder: du reservierst dir mit _MemGlobalAlloc Speicher und setzt den Pointer zum Speicher in den Parameter, um später mit dllstructs darauf zuzugreifen.

  • Wieso kommt die MsgBox zwei mal?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    Wieso kommt die MsgBox zwei mal?

    Die erste gibt das gesetzte Datum aus, die zweite das ausgelesene Datum.

    Du hättest doch auch EPOCH /Unix-timestamp verwenden können ;) 1970-2038 mit positiven Werten, kleiner als 1970 mit negativen Werten.

    Oder: du reservierst dir mit _MemGlobalAlloc Speicher und setzt den Pointer zum Speicher in den Parameter, um später mit dllstructs darauf zuzugreifen.


    Werde ich mal beides testen und probieren was im Handling einfacher ist.


    Edit:
    Habe beides ausprobiert - funktioniert. Variante Unix-Timestamp kann verwendet werden für Datumsbereich 1902 - 2038, damit haben wir den Bereich schon mal aufgespreizt. ;)
    Die zweite Variante hat den Vorteil, dass keine Datumsgrenzen existieren. Der Nachteil ist aber eine zusätzliche Speicherverwaltung.
    Also werde ich es auf die Timestamp-Variante abändern.