How to parse EXIF Date Time data

Here's a code snippet from an old program I have lying around that does something very similar to this:

string dateTakenText;
using (Image photo = Image.FromFile(file.Name))
{
    PropertyItem pi = photo.GetPropertyItem(Program.propertyTagExifDTOrig_);
    ASCIIEncoding enc = new ASCIIEncoding();
    dateTakenText = enc.GetString(pi.Value, 0, pi.Len - 1);
}
if (string.IsNullOrEmpty(dateTakenText))
{
    continue;
}
DateTime dateTaken;
if (!DateTime.TryParseExact(dateTakenText, "yyyy:MM:dd HH:mm:ss",
    CultureInfo.CurrentCulture, DateTimeStyles.None, out dateTaken))
{
    continue;
}

This code snippet sits inside a foreach loop, which explains the use of the continue keyword.

This is code from a program I wrote sometime back in 2002 or 2003, and I've been using it regularly since then; it works pretty reliably.


This link describes a way that parses the individual parts of the string instead of parsing it using DateTime.Parse:

/// <summary>
/// Returns the EXIF Image Data of the Date Taken.
/// </summary>
/// <param name="getImage">Image (If based on a file use Image.FromFile(f);)</param>
/// <returns>Date Taken or Null if Unavailable</returns>
public static DateTime? DateTaken(Image getImage)
{
    int DateTakenValue = 0x9003; //36867;

    if (!getImage.PropertyIdList.Contains(DateTakenValue))
        return null;

    string dateTakenTag = System.Text.Encoding.ASCII.GetString(getImage.GetPropertyItem(DateTakenValue).Value);
    string[] parts = dateTakenTag.Split(':', ' ');
    int year = int.Parse(parts[0]);
    int month = int.Parse(parts[1]);
    int day = int.Parse(parts[2]);
    int hour = int.Parse(parts[3]);
    int minute = int.Parse(parts[4]);
    int second = int.Parse(parts[5]);

    return new DateTime(year, month, day, hour, minute, second);
}

Thanks to Mark Seemann & Markus, I got this figured out finally. The time in the EXIF data is in 24 hour / military time. The "hh" format specifier in the string is for 12 hour time with an AM/PM. The time I was passing was at 14:14, or 2:14 PM. In 12 hour time, "14" is an invalid time.

So the correct format specifier is "yyyy:MM:dd HH:mm:ss".

Tags:

C#

Datetime

Exif