Unix Timestamp

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Unix Timestamp

Re: Unix Timestamp

Post by jNizM » 31 Mar 2016, 06:22

Vielleicht sind wir ja 2038 schon bei 128-Bit oder 256-Bit angekommen

Re: Unix Timestamp

Post by just me » 31 Mar 2016, 06:19

@fump2000: Wenn ihr wisst, dass es sich um Unix-Zeit handelt, ist es eigentlich auch nicht so schwer, die passende Differenz anhand des Datums im Kopf zu addieren. Das überlebt dann auch das Jahr 2038. ;)

Re: Unix Timestamp

Post by jNizM » 31 Mar 2016, 06:16

Ach, spätestens 2038 ist es mit der Unixzeit sowieso vorbei :P (32-Bit)
wiki/Unixzeit#Jahr-2038-Problem

Re: Unix Timestamp

Post by just me » 31 Mar 2016, 06:14

@jNizM: (A_NowUTC - A_Now) gibt ja nur die Differenz für den heutigen Tag (31.03.2016 = Sommerzeit) zurück. Wenn der Zeitstempel aber dann aber z.B. auf den 14.03.2016 zeigt, hilft das nicht weiter.

Re: Unix Timestamp

Post by fump2000 » 31 Mar 2016, 05:47

Auf http://www.unixtime.de/ ergibt 1459402085 = 31.03.2016 - 07:28:05
Der TimeStamp stammt aus einem LoginSystem unserer DSL Anschlüsse und beschreibt den letzten Login des Routers.

Der Kunde hat in diesem Fall, den Router ungefähr um diese Zeit neu gestartet. Der TimeStamp passt also.

Re: Unix Timestamp

Post by jNizM » 31 Mar 2016, 05:40

Könnte man die Sommer-/Winterzeit Berechnung so lösen?

Code: Select all

MsgBox % unix_convert(1459402085, "dd.MM.yyyy - HH:mm:ss")    ; ==> 31.03.2016 - 05:28:05 (da Sommerzeit | 06:28:05 bei Winterzeit)
 
unix_convert(unix, format) {
	static MET := ((A_NowUTC - A_Now) // 10000) * 3600    ; Berechne MET (Sommer- / Winterzeit)
    real := 19700101000000                                ; Beginn der UNIX Zeitrechnung (01.01.1970)
    real += unix, s                                       ; + Anzahl an Sekunden vom UNIX-Timestamp
    real += MET, h                                        ; Kalkuliere Sommer- / Winterzeit mit ein
    FormatTime, output, % real, % format                  ; Formartiert mit Datum & Uhrzeit
    return output
}
edit... hmn... nich ganz

Re: Unix Timestamp

Post by fump2000 » 31 Mar 2016, 05:35

Danke!

Angenommen, ich lasse den User per DateTime control ein Datum vorgeben welches in einen Unix Timestamp umgerechnet werden soll.
Muss ich dann die Sommerzeit wieder rausrechnen? Ich mein, der User gibt ja z.B. 31.03.2016 10:00 vor. Am Ende sollte dies ja auch wieder raus kommen...

Dann muss ich den User darauf hinweisen, dass seine Eingabe im UTC Zeitformat erfolgen muss. Das wäre wohl am einfachsten oder?

Re: Unix Timestamp

Post by just me » 31 Mar 2016, 05:18

Hallo fump,

jein, das sollte nur zeigen, dass man nicht einfach immer 1 Stunde addieren kann. Die berühmten 'Unix Time Stamps' beziehen sich immer auf die UTC (Universal Time, Coordinated). Die Differenz zwischen UTC und lokaler Zeit verändert sich im Laufe des Jahres durch die unerquickliche und überflüssige Sommerzeit. Deshalb sind die meisten der von Dir gefundenen Funktionen 'echt mega kompliziert'.

Glücklicherweise tickt die interne Uhr bei Windows Rechnern ebenfalls in UTC. Und es gibt API-Funktionen zum Umrechnen zwischen beiden Welten:

Code: Select all

#NoEnv
UTC1 := unix2Human(1459402085)
LOC := UTC_ToLocalTime(UTC1)
UTC2 := UTC_FromLocalTime(LOC)
MsgBox, UTC1: %UTC1%`nLOC:  %LOC%`nUTC2: %UTC2%


ExitApp
; ----------------------------------------------------------------------------------------------------------------------------------
unix2Human(unixTimestamp) {
	returnDate = 19700101000000
	returnDate += unixTimestamp, s
	return returnDate
}
; ----------------------------------------------------------------------------------------------------------------------------------
UTC_ToLocalTime(UTC := "") {
   UTC += 0, S
   If UTC Is Not Time
      Return ""
   UTC_TS2SYSTEMTIME(UTC, UTCTime)
   VarSetCapacity(LocTime, 16, 0)
   DllCall("SystemTimeToTzSpecificLocalTime", "Ptr", 0, "Ptr", &UTCTime, "Ptr", &LocTime)
   Return UTC_SYSTEMTIME2TS(LocTime)
}
; ----------------------------------------------------------------------------------------------------------------------------------
UTC_FromLocalTime(Local := "") {
   Local += 0, S
   If Local Is Not Time
      Return ""
   UTC_TS2SYSTEMTIME(Local, LocTime)
   VarSetCapacity(UTCTime, 16, 0)
   DllCall("TzSpecificLocalTimeToSystemTime", "Ptr", 0, "Ptr", &LocTime, "Ptr", &UTCTime)
   Return UTC_SYSTEMTIME2TS(UTCTime)
}
; ----------------------------------------------------------------------------------------------------------------------------------
UTC_TS2SYSTEMTIME(TS, ByRef SYSTEMTIME) { ; Timestamp to SYSTEMTIME
   VarSetCapacity(SYSTEMTIME, 16, 0)
   NumPut(SubStr(TS, 1, 4), SYSTEMTIME, 0, "UShort")
   NumPut(SubStr(TS, 5, 2), SYSTEMTIME, 2, "UShort")
   NumPut(SubStr(TS, 7, 2), SYSTEMTIME, 6, "UShort")
   NumPut(SubStr(TS, 9, 2), SYSTEMTIME, 8, "UShort")
   NumPut(SubStr(TS, 11, 2), SYSTEMTIME, 10, "UShort")
   NumPut(SubStr(TS, 13, 2), SYSTEMTIME, 12, "UShort")
}
; ----------------------------------------------------------------------------------------------------------------------------------
UTC_SYSTEMTIME2TS(ByRef SYSTEMTIME) { ; Timestamp from SYSTEMTIME
   YYYY := NumGet(SYSTEMTIME, 0, "UShort")
   MM := NumGet(SYSTEMTIME, 2, "UShort")
   DD := NumGet(SYSTEMTIME, 6, "UShort")
   HH := NumGet(SYSTEMTIME, 8, "UShort")
   MN := NumGet(SYSTEMTIME, 10, "UShort")
   SS := NumGet(SYSTEMTIME, 12, "UShort")
   Return Format("{:04}{:02}{:02}{:02}{:02}{:02}", YYYY, MM, DD, HH, MN, SS)
}

Re: Unix Timestamp

Post by fump2000 » 31 Mar 2016, 05:04

@just me
das löst das "Sommerzeitproblem" richtig? Sprich in der Winterzeit ist das Ergbnis 1 wo jetzt eine 2 kommt. Korrekt?

Re: Unix Timestamp

Post by just me » 31 Mar 2016, 03:40

Code: Select all

#NoEnv
UTCDiff := A_Now ; braucht man nicht, wenn UTCDiff leer ist!
UTCDiff -= A_NowUTC, H
MsgBox, %UTCDiff%
ExitApp

Re: Unix Timestamp

Post by jNizM » 31 Mar 2016, 03:25

Code: Select all

MsgBox % unix_convert(1459402085, "dd.MM.yyyy - HH:mm:ss")    ; ==> 31.03.2016 - 06:28:05

unix_convert(unix, format) {
    real := 19700101000000                  ; Beginn der UNIX Zeitrechnung (01.01.1970)
    real += unix, s                         ; + Anzahl an Sekunden vom UNIX-Timestamp
    real += 1, h                            ; + 1 Stunde für UTC+1 (MET)
    FormatTime, output, % real, % format    ; Formartiert mit Datum & Uhrzeit
    return output
}

Re: Unix Timestamp

Post by fump2000 » 31 Mar 2016, 02:21

Hab da was gefunden im alten Forum:
https://autohotkey.com/board/topic/2486 ... timestamp/

Echt mega kompliziert das ganze hin und her gerechne...

EDIT:

Na so kompliziert dann auch nicht...

Code: Select all

;http://www.autohotkey.com/forum/topic2633.html
;msgbox % "%A_Now%:`r--> " . A_Now . "`r`rconverted to Unix:`r--> " . human2Unix(A_Now) . "`r`rand back to human:`r--> " . unix2Human(human2Unix(A_Now))

unix2Human(unixTimestamp) {
	returnDate = 19700101000000
	returnDate += unixTimestamp, s
	return returnDate
}


human2Unix(humanTime) {
	humanTime -= 1970, s
	return humanTime
}

Unix Timestamp

Post by fump2000 » 31 Mar 2016, 02:10

Hallo zusammen,

hatte einer von euch schon mal das Problem einen solchen Timestamp in ein lesbares format bringen zu müssen?

Beispiel: 1457964343 = Realzeit: 14.03.2016 - 15:05:43
Beispiel: 1459402085 = Realzeit: 31.03.2016 - 07:28:05

Kann man schön hier umrechnen: http://www.unixtime.de/

Wie könnte man das in AHK lösen damit auch die Urzeit 100%ig stimmt?

MfG
fump

Top