Datum String unbekanntes Zeichen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von D@niel.

    Datum String unbekanntes Zeichen

    Guten Abend,

    ich lese mit nachfolgender Funktion das Aufnahmedatum eins Bildes aus.

    VB.NET-Quellcode

    1. Public Function GetExtendedProperty(fi As IO.FileInfo, Position As Integer) As String
    2. Dim shell As New Shell32.Shell()
    3. Dim folder As Shell32.Folder = shell.NameSpace(fi.DirectoryName)
    4. Dim fldItem As Shell32.FolderItem = folder.Items().Item(fi.Name)
    5. Dim fldItem2 As Shell32.FolderItem2 = DirectCast(fldItem, Shell32.FolderItem2)
    6. Return folder.GetDetailsOf(fldItem2, Position)
    7. End Function


    Der Aufruf sieht wie folgt aus:

    VB.NET-Quellcode

    1. Dim Zeitstempel as String
    2. Dim Datum as String
    3. Zeitstempel = GetExtendedProperty(fi, 12) 'Ruft das Aufnahmedatum der Datei ab
    4. Datum = Zeitstempel.Substring(0, Zeitstempel.IndexOf(" ")) 'Schneidet den String ab dem Leerzeichen ab und ignoriert so die Zeit


    Ich bekomme auch einen String mit Datum und Uhrzeit zurück. z.B. "‎13.‎09.‎2020 ‏‎12:30" (direkte Kopie während der Laufzeit)
    Dieser String sieht auch augenscheinlich richtig aus. Das zerlegen sieht zunächst auch ganz gut aus. Wenn ich das Ergebnis über eine Message Box ausgebe sieht es wie im Format dd.mm.yyyy aus.

    Im Weiteren möchte ich mit dem Datum String weiterarbeiten und ermittle die String länge (Ja ich weiß müssten eigentlich immer 10 Zeichen sein).
    Allerdings erhalte ich das Ergebnis 13.

    Um dem ganzen auf die Schliche zu kommen gebe ich im Debug Fenster mittels folgender Schleife die Zeichen einzeln aus:

    VB.NET-Quellcode

    1. Dim i as Integer
    2. Debug.Print("Start")
    3. For i = 0 To Datum.Length - 1
    4. Debug.Print(Datum.Chars(i))
    5. Next
    6. Debug.Print("Ende")


    Nachfolgend die kopierte Ausgabe:

    Start

    1
    3
    .

    0
    9
    .

    2
    0
    2
    0
    Ende

    Ich habe schon mit Replace bzw. Trim versucht mögliche Leerzeichen zu löschen ohne Erfolg.

    Einzig folgender Replace hat geholfen. Allerdings würde ich gerne genau Wissen was sich da einschleicht und gezielt "löschen".

    VB.NET-Quellcode

    1. Datum = Replace(Datum, Datum.Chars(0), "")


    Mein Ansatz wäre jetzt herausfinden um was für ein Zeichen es sich handelt. Allerdings das wie ist mein Problem.

    Vielen Dank für eure Denkanstöße.

    Viele Grüße

    Daniel
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Ich würde gerne auf Bildinformationen die unter "Details" abgelegt sind zugreifen. Ich hatte zunächst mit FileInfo gearbeitet allerdings nie das "richtige" Aufnahmedatum erhalten sondern die Angaben die unter "Allgemein" in den Eigenschaften zu finden sind.

    Die unter folgendem Link aufgeführten Eigenschaften haben alle nicht zum Ziel geführt. CreationTime ist nicht gleich dem Aufnahmedatum.

    docs.microsoft.com/de-de/dotne…fileinfo?view=netcore-3.1

    Daher hatte ich einen anderen Weg gewählt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Laut stackoverflow und meinen Bestätigungsexperimenten sind da aber sehr spezielle Zeichen im String drin.
    Daher würd ich das so machen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim CreationDate = GetCreationDateOf(New FileInfo(Dateipfad))
    3. End Sub
    4. Private Function GetCreationDateOf(FileInfo As FileInfo) As Date
    5. Dim RawDate = GetExtendedProperty(FileInfo, 12).Split(" "c)(0)
    6. Dim ClearData = RawDate.Replace(Convert.ToChar(8206), "") '.Replace(Convert.ToChar(8207), "")
    7. Return Date.Parse(ClearData)
    8. End Function
    9. Public Function GetExtendedProperty(FileInfo As FileInfo, Position As Integer) As String
    10. Dim Folder = New Shell32.Shell().NameSpace(FileInfo.DirectoryName)
    11. Dim FolderItem2 = DirectCast(Folder.Items().Item(FileInfo.Name), Shell32.FolderItem2)
    12. Return Folder.GetDetailsOf(FolderItem2, Position)
    13. End Function

    zzgl. eventuellem Fehlerabfangen natürlich
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    VaporiZed dein Ansatz funktioniert und ich kann es grundsätzlich auch nachvollziehen.

    Was sich mir nach ersten Recherchen nicht direkt erschließt ist wie du zu 8206 bzw. 8207 kommst?
    Das war ja auch meine ursprüngliche Frage wie ich rausfinden kann um was für ein "Zeichen" es sich handelt

    Weil grundsätzlich wandelt man mit convert.ToChar ja in Unicode so weit ich es verstanden habe?!

    Auf der folgenden Website finde ich grundsätzlich auch den entsprechenden Unicode. Ich hätte jetzt try and error machen müssen um letztlich den richtigen zu erwischen.
    vertex42.com/ExcelTips/unicode-symbols.html

    Vielen Dank schon einmal bis hierhin.

    VB.NET-Quellcode

    1. Private Function GetCreationDateOf(FileInfo As FileInfo) As Date
    2. Dim RawData = GetExtendedProperty(FileInfo, 12).Split(" "c)(0)
    3. Dim FirstCharacter = RawData(0)
    4. Dim IndexOfCharacterInUnicodeTable = Convert.ToInt32(FirstCharacter)
    5. MessageBox.Show($"Das erste Zeichen hat den Unicode-Index {IndexOfCharacterInUnicodeTable}.")
    6. Dim ClearData = RawData.Replace(Convert.ToChar(8206), "") '.Replace(Convert.ToChar(8207), "")
    7. Return Date.Parse(ClearData)
    8. End Function
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @D@niel Ich gehe mal davon aus, dass das ANSI, nicht aber Unicode ist.
    Da würde ich zunächst die Codes aller Zeichen (die Bytes selbst) ausgeben, um Steuerzeichen und solch zu erkennen.
    @ErfinderDesRades '\0' allein ist nicht gesichert, da da mehrere Strrings stehen können, da wäre "\0\0" das Ende.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!