Umrechnung Unix Time-Stamp in Excel

  • #21
Hallo marthaeng,

dann sehen wir mal zu das der Praktikant Kaffe kochen kann :)

a) zu richtigem Makro:
  Ich hab im Thread bis auf den relevanten Makro alle gelöscht.
  -> keine Verwechselungsmöglichkeit mehr :)

b) zu Beispiel Timestamp-Umrechnung
Es ist richtig das für GMT +0  der Timestamp 1139111399.468
als Datum Sunday, February 5th 2006, 3:49:59 (GMT) liefern muß.
(für die Einstellung GMT +0 macht dies das Makro)

Ein guter Onlineumrechner ist z.B.

Bei dem kann mann auch die Zeitzone wählen, also z.B. GMT+1 für Deutschland
(der in wikipedia verlinkte Umrechner kann das z.B. nicht  :mad: )

c) Zeitzone richtig einstellen
Je nach dem in welcher Zeitzone du dich befindest, mußt du beim Umrechnen die Zeitverschiebung mit berücksichtigen.

Im Makro ist dazu die Konstante
Code:
'!!!!! Z E I T Z O N E in Stunden angeben !!!!!!!!!!!!!!!!
'!!!!!
'z.B. GMT +1
Const c_ZEITVERSCHIEBUNG_ZU_GMT_IN_STUNDEN As Double = 1
'!!!!!
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
anzupassen. Für reine GMT-Zeit(also GMT+0) müßte die Konstante auf 0 geändert werden.

d) Formatierung der Zelle mit dem Unix-Timestamp
Die Formatierung sollte 'Text'sein, da der Punkt im deutschen Raum als->Tausendertrennzeichen' interpretiert werden würde.

Gruß Matjes :)
 
  • #22
Danke matjes das problem war aber nicht die uhrzeit ( das war mir klar) sondern die Jahreszahl! Der bingt immer 2010 und nicht 2006!!
Danke dir für deine Hilfe im vorraus!!
 
  • #23
Hallo marthaeng,

ich müßte das mal anhand der Orginal-Datei oder eines Teilabzugs nachverfolgen. Es wäre super, wenn dann auch noch der verwendete Makro enthalten wäre.

Schickst du mir mal so einen Teilabzug ?

Gruß Matjes :)
 
  • #24
an welche adresse soll ich dir das zukommen lassen?

Gruss
MArtin
 
  • #25
Hallo zusammen,

der Fehler ist gefunden  :D

Ursache des Ganzen war die Einstellung 1904-Datum (also mit negativen Zahlen
rechnen)
Da im ursprünglichen Makro das Datum als double-Wert berechnet wurde,
und dann auch direkt gespeichert, kam die Verschiebung um 4 Jahre zustande.
Nun wird der double-Wert noch in einen Datums-Wert gecastet und es paßt.

Jetzt ist es dem makro egal, ob er auf 1900-Datum oder 1904-Datum rechnet
:)

Vielen Dank für die zugeschickte Datei. Ohne die wäre ich nicht
dahintergekommen.

Zusätzlich hab ich noch eingebaut:
- leere Zellen werden übergangen
- die Selektion wird auf den benutzten Bereich reduziert.
- Fortschrittsanzeige in der Statuszeile

Um Verwechslungen auszuschliessen hier das End-Produkt.
Der alte Makro oben wird gelöscht.

Gruß Matjes :)
Code:
Option Explicit

'!!!!! Z E I T Z O N E in Stunden angeben !!!!!!!!!!!!!!!!
'!!!!!
'z.B. GMT +1
Const c_ZEITVERSCHIEBUNG_ZU_GMT_IN_STUNDEN As Double = 1
'!!!!!
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Const c_ZEITVERSCHIEBUNG_ZU_GMT_IN_SEKUNDEN As Long = _
      c_ZEITVERSCHIEBUNG_ZU_GMT_IN_STUNDEN * 3600

'***************************************************************
Sub SelektierteZellenMitUTCTimestampInExcelDatum()
 ->
 ->Wandelt den in einer Zelle enthaltenen UTC-Timestamp
 ->in eine Excel-Datums/Zeitangabe (dd.mm.yyyy hh:nn:ss)
 ->1000stel Sekunden werden abgeschnitten
 ->
 ->Die Umwandlung wird für alle selektierten Zellen durchgeführt
  Dim Zelle As Range, r As Range, l_Anz As Long, l_AnzGesamt As Long
  
 ->Selection auf benutzten Bereich beschränken
  Set r = Intersect(Selection, ActiveSheet.UsedRange)
  r.Select
  
  l_AnzGesamt = r.Count
  l_Anz = 0
  
  For Each Zelle In r
    
   ->Fortschritt anzeigen
    l_Anz = l_Anz + 1
    If (l_Anz Mod 100) = 1 Then Application.StatusBar = l_AnzGesamt &  /  & l_Anz
    If Zelle.Value <>  Then
      If Not Umwandlung_ZelleMitUTCTimestampInExcelDatum(Zelle) Then
        Zelle.Select
        MsgBox ( _
          Es ist bei der Umwandlung ein Fehler aufgetreten & vbLf & vbLf & _
          Die Zelle  & Zelle.Address &  konnte nicht umgewandelt werden.)
        Exit For
      End If
    End If
  Next
  
  Application.StatusBar = 
  Set Zelle = Nothing: Set r = Nothing
End Sub

'***************************************************************
Private Function Umwandlung_ZelleMitUTCTimestampInExcelDatum(Zelle As Range) As Boolean
 ->Wandelt den in einer Zelle enthaltenen UTC-Timestamp
 ->in eine Excel-Datums/Zeitangabe (dd.mm.yyyy hh:nn:ss)
 ->
 ->1000stel Sekunden werden abgeschnitten
  
 ->UTC-Format:
  
 ->mit 1000stel Sekunden: 1119307449.652
 ->Bezug: Sekunden seit 1.1.1970 00:00:00:000
 ->entspricht 20. Juni 2005 22:44:09
  
 ->Excel-Datum:
    
 ->Aus der Microsoft-Hilfe:
 ->Variablen vom Datentyp Date werden als 64-Bit-Gleitkommazahlen (8 Bytes)
 ->nach IEEE gespeichert und können ein
 ->Datum im Bereich vom 01. Januar 100 bis zum 31. Dezember 9999 und
 ->eine Uhrzeit im Bereich von 0:00:00 bis 23:59:59 speichern.
 ->Jeder gültige Wert eines Datums- oder Zeitliterals kann einer Variablen
 ->vom Datentyp Date zugewiesen werden.
 ->Ein Datumsliteral muß durch das Zeichen (#) eingeschlossen sein,
 ->zum Beispiel: #January 1, 1993# oder #1 Jan 93#.

 ->Variablen vom Datentyp Date verwenden zur Darstellung des Datums
 ->das auf dem Computer eingestellte kurze Datumsformat.
 ->Zeitangaben werden mit dem auf dem Computer eingestellten Zeitformat
 ->(entweder 12- oder 24-Stunden) dargestellt.

 ->Beim Umwandeln anderer numerischer Datentypen in Werte des Datentyps Date
 ->repräsentieren die Vorkommastellen das Datum und die Nachkommastellen die Uhrzeit.
 ->Mitternacht entspricht dem Wert 0, und Mittag entspricht den Nachkommawert 0,5.
 ->Negative ganze Zahlen repräsentieren ein Datum vor dem 30. Dezember 1899.
  
 ->Der 1.1.1970 00:00:00 entspricht 25569 Tage seit 30. Dezember 1899
  Const c_AnzTage_30122005bis01011970 = 25569
  Const c_SekundenProTag As Long = 86400
  
  Dim s_UTCZeit As String
  Dim l_UTC_Sekunden As Long         ->UTC-Zahl ohne 1000stel sec
  Dim l_UTC_AnzTage As Long           'Tage     in der UTC-Zeit
  Dim l_UTC_Sekunden_Uhrzeit As Long ->Tageszeit in sec in der UTC-Zeit
  Dim d_date_Excel As Double         ->Excel-Datum
  Dim pos As Long
  Dim d_Datum As Date
  
 ->Fehlerkennung setzen
  Umwandlung_ZelleMitUTCTimestampInExcelDatum = False
  
 ->Nur eine Zelle im Übergabe-Range zulässig
  If Zelle.Count > 1 Then Exit Function
  
 ->UTCZeit holen
  s_UTCZeit = Zelle.Value
  
 ->ggf tausendstel Sekunden abschneiden
  pos = InStr(s_UTCZeit, .)
  If pos <> 0 Then s_UTCZeit = Left(s_UTCZeit, pos - 1)
  
 ->auf Zahl prüfen
  On Error Resume Next
  l_UTC_Sekunden = s_UTCZeit
  If Err.Number <> 0 Then
    MsgBox (UTC-Zeit enthält unzulässige Zeichen)
    Exit Function
  End If
  On Error GoTo 0
  
 ->GMT-Zeitzone berücksichtigen
  On Error Resume Next
  l_UTC_Sekunden = l_UTC_Sekunden + c_ZEITVERSCHIEBUNG_ZU_GMT_IN_SEKUNDEN
  If Err.Number <> 0 Then
    MsgBox (UTC-Sekunden-Überlauf)
    Exit Function
  End If
  On Error GoTo 0
  
 ->prüfen vor 1.1.1970
  If l_UTC_Sekunden > 0 Then
  
   -> b) Aus der UTC-Zeit sind die Anzahl Tage seit 1.1.1970 bestimmen
    l_UTC_AnzTage = l_UTC_Sekunden \ c_SekundenProTag
    
   -> c) der Rest ist die Uhrzeit in Sekunden
    l_UTC_Sekunden_Uhrzeit = l_UTC_Sekunden - (l_UTC_AnzTage * c_SekundenProTag)
  
   -> d) Excel Datum/Uhrzeit bilden
    d_date_Excel = c_AnzTage_30122005bis01011970 + _
                  l_UTC_AnzTage + (l_UTC_Sekunden_Uhrzeit / c_SekundenProTag)
  
  Else
  
   -> b) Aus der UTC-Zeit sind die Anzahl Tage seit 1.1.1970 bestimmen
    
   ->genau die Tagesgrenze ?
    If (l_UTC_Sekunden Mod c_SekundenProTag) = 0 Then
      l_UTC_AnzTage = (-1 * (l_UTC_Sekunden \ c_SekundenProTag))
    Else
      l_UTC_AnzTage = (-1 * (l_UTC_Sekunden \ c_SekundenProTag)) + 1
    End If
    
   -> c) der Rest ist die Uhrzeit in Sekunden
    l_UTC_Sekunden_Uhrzeit = l_UTC_Sekunden + (l_UTC_AnzTage * c_SekundenProTag)
  
  
   -> d) Excel Datum/Uhrzeit bilden
    d_date_Excel = c_AnzTage_30122005bis01011970 - _
                  l_UTC_AnzTage + (l_UTC_Sekunden_Uhrzeit / c_SekundenProTag)
  
  End If
  
  
 ->Datum speichern
 ->Zelle als Datum formatieren
  Zelle.NumberFormat = dd.mm.yyyy hh:mm:ss
  d_Datum = d_date_Excel                           '### Korrektur 13.2.2006
                                                   'Notwendig, da Excel hier
                                                   'die Korrektur bzgl. der
                                                   'Datumskorrektur 1900/1904
                                                   'durchführt
  Zelle.Value = d_Datum
  
 ->Fehlerkennung setzen
  Umwandlung_ZelleMitUTCTimestampInExcelDatum = True

End Function


'***************************************************************
Sub SelektierteZelleMitExcelDatumInUTCTimestamp()
 ->
 ->Wandelt das in einer Zelle enthaltene Excel-Datum
 ->in einen UTC-Timestamp
 ->
 ->Die Umwandlung wird für alle selektierten Zellen durchgeführt
  Dim Zelle As Range, r As Range, l_Anz As Long, l_AnzGesamt As Long
  
 ->Selection auf benutzten Bereich beschränken
  Set r = Intersect(Selection, ActiveSheet.UsedRange)
  r.Select
  
  l_AnzGesamt = r.Count
  l_Anz = 0
  
  For Each Zelle In r
    If Zelle.Value <>  Then
    
     ->Fortschritt anzeigen
      l_Anz = l_Anz + 1
      If (l_Anz Mod 100) = 1 Then Application.StatusBar = l_AnzGesamt &  /  & l_Anz
    
      If Not Umwandlung_ZelleMitExcelDatumInUTCTimestamp(Zelle) Then
        Zelle.Select
        MsgBox ( _
          Es ist bei der Umwandlung ein Fehler aufgetreten & vbLf & vbLf & _
          Die Zelle  & Zelle.Address &  konnte nicht umgewandelt werden.)
        Exit For
      End If
    End If
  Next

  Application.StatusBar =   
  Set Zelle = Nothing: Set r = Nothing
End Sub

'*************************************************************
Private Function Umwandlung_ZelleMitExcelDatumInUTCTimestamp(Zelle As Range) As Boolean
  
  Const c_AnzTage_30122005bis01011970 = 25569
  Const c_SekundenProTag As Long = 86400
  
  Dim s_UTCZeit As String
  Dim l_UTCZeit As Long
  Dim d_date_Excel As Double
  Dim l_Excel_AnzTage As Long
  Dim l_Excel_Zeit As Long
  Dim l_ZeitInSekunden As Long
  Dim pos As Long

 ->Fehlerkennung setzen
  Umwandlung_ZelleMitExcelDatumInUTCTimestamp = False
  
 ->Nur eine Zelle im Übergabe-Range zulässig
  If Zelle.Count > 1 Then Exit Function
  
 ->auf Datum prüfen
  If Not IsDate(Zelle.Value) Then Exit Function
  
 ->Excel-Datum holen
  d_date_Excel = Zelle.Value

 ->Excel Tage
  l_Excel_AnzTage = d_date_Excel \ 1
  
 ->Excel Zeit
  d_date_Excel = d_date_Excel - l_Excel_AnzTage
  
 ->Tageszeit in Sekunden
  l_ZeitInSekunden = d_date_Excel * c_SekundenProTag
  
 ->GMT-Zeitzone berücksichtigen
  l_ZeitInSekunden = l_ZeitInSekunden - c_ZEITVERSCHIEBUNG_ZU_GMT_IN_SEKUNDEN
  
 ->prüfen vor 1.1.1970
  If l_Excel_AnzTage >= c_AnzTage_30122005bis01011970 Then
  
    s_UTCZeit = _
      ((l_Excel_AnzTage - c_AnzTage_30122005bis01011970) * c_SekundenProTag) + l_ZeitInSekunden
    
  Else
    
    l_UTCZeit = _
      ((l_Excel_AnzTage - c_AnzTage_30122005bis01011970) * c_SekundenProTag)
      
    If l_ZeitInSekunden <> 0 Then l_UTCZeit = l_UTCZeit + l_ZeitInSekunden
    
    s_UTCZeit = l_UTCZeit
  End If
  
  
 ->UTC speichern
 ->Zelle als String formatieren
  Zelle.NumberFormat = @
  Zelle.Value = s_UTCZeit
  
 ->Fehlerkennung setzen
  Umwandlung_ZelleMitExcelDatumInUTCTimestamp = True

End Function


'*************************************************************
Sub Test_UTCTimestampInExcelDatumUndUmgekehrt()

  Dim wb As Workbook, ws As Worksheet
  Dim x As Long, c As Long, d_date As Date
  
  Set wb = ActiveWorkbook: Set ws = wb.Worksheets.Add
  
  
  ws.Columns(1).NumberFormat = dd.mm.yyyy hh:mm:ss
  ws.Cells(1, 1).Value = Datum
  ws.Cells(1, 1).Font.Bold = True
  ws.Columns(2).NumberFormat = dd.mm.yyyy hh:mm:ss
  ws.Cells(1, 2).Value = UTC-Timestamp
  ws.Cells(1, 2).Font.Bold = True
  ws.Columns(3).NumberFormat = dd.mm.yyyy hh:mm:ss
  ws.Cells(1, 3).Value = Kontroll-Datum
  ws.Cells(1, 3).Font.Bold = True
  
 ->Datum für Test in die Spalten 1 -3
  For c = 1 To 3: d_date = 01.01.1970 00:00:00: ws.Cells(2, c).Value = d_date: Next
  For c = 1 To 3: d_date = 31.12.2005 23:59:59: ws.Cells(3, c).Value = d_date: Next
  For c = 1 To 3: d_date = 31.12.2005 00:00:00: ws.Cells(4, c).Value = d_date: Next
  For c = 1 To 3: d_date = 31.12.2005 00:00:01: ws.Cells(5, c).Value = d_date: Next
  For c = 1 To 3: d_date = 31.12.1969 23:59:59: ws.Cells(6, c).Value = d_date: Next
  For c = 1 To 3: d_date = 01.01.1969 00:00:00: ws.Cells(7, c).Value = d_date: Next
  For c = 1 To 3: d_date = 01.01.1969 00:00:01: ws.Cells(8, c).Value = d_date: Next
  For c = 1 To 3: d_date = 01.01.1990 00:00:00: ws.Cells(9, c).Value = d_date: Next
  For c = 1 To 3: d_date = 01.01.2006 01:05:05: ws.Cells(10, c).Value = d_date: Next
  For c = 1 To 3: d_date = 01.01.1970 01:00:00: ws.Cells(11, c).Value = d_date: Next
  For c = 1 To 3: d_date = 01.01.1902 01:05:05: ws.Cells(12, c).Value = d_date: Next
  For c = 1 To 3: ws.Columns(c).AutoFit: Next
  
 ->zweite Spalte in UTC wandeln
  ws.Range(ws.Cells(2, 2), ws.Cells(12, 2)).Select
  Call SelektierteZelleMitExcelDatumInUTCTimestamp
  
 ->dritte Spalte in UTC wandeln
  ws.Range(ws.Cells(2, 3), ws.Cells(12, 3)).Select
  Call SelektierteZelleMitExcelDatumInUTCTimestamp
  
 ->dritte Spalte in Excel-Datum wandeln
  ws.Range(ws.Cells(2, 3), ws.Cells(12, 3)).Select
  Call SelektierteZellenMitUTCTimestampInExcelDatum
  
AUFRAEUMEN:
  Set ws = Nothing: Set wb = Nothing
End Sub
   
 
  • #26
Mein König Matjes ;D! DANKE DIR 1000000 mal! Jetzt dürfen meine Hilfskräfte wieder Kaffee und Schnittchen aus der Cafete mir bringen :D
 
Thema:

Umrechnung Unix Time-Stamp in Excel

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben