Fix EXIF Dates and Times with Jhead
My parents recently returned from several weeks of travelling and brought back with them, a couple of thousand photos taken using two different cameras. We wanted to merge the photos from both cameras in to one directory so they could be viewed in chronological order, but soon realised the EXIF date and times were incorrect due to both cameras having their internal clocks incorrectly set.
Modifying the EXIF data in photos is pretty easy - a lot of image viewing / editing apps will let you do this, but usually on a one by one basis. That's a lot of pain for adjusting ~2,000 photos! A quick Google search turned up a selection of apps that looked like they would do the job but I settled on Jhead because it works from the command line and is available from Ubuntu's standard repositories. There are also Windows and OS X binaries available if you're using either of those platforms.
Installing Jhead
Jhead's been around for over a decade so if you're using Linux, it's most likely in your distro's repositories. For Windows and OS X you can download it from here.
On Ubuntu, installing Jhead is as easy as:-
sudo apt-get install jhead
Or if you'd prefer, just search for 'Jhead' from the graphical package manager.
Modifying the EXIF Date and Time
Firstly, you need to work out how much time you need to adjust your photo's EXIF data by in order to correct them. Because the photos I was working with came from two different cameras, each with a different date and time set, I separated them in to two directories and did this for each.
A full summary of Jhead's command line arguments can be found here but for most purposes there are only two options we need to make use of, one for adjusting the time by a specified offset and one for adjusting the date.
To adjust the time, we use the -ta option followed (without space) by the offset to use in hh:mm or hh:mm:ss format. If, for example, your photo's times are set 1 hour too far in to the future, we can subtract a single hour from all photos using the following.
jhead -ta-1:00 *.jpg
If the photos were set 12 hours, 20 minutes and 43 seconds too far in the past, we'd offset with a positive value.
jhead -ta+12:20:43 *.jpg
For offsets greater than 24 hours, we can use the -da option followed by two dates in yyyy:mm:dd format, or to include a time, as yyyy:mm:dd/hh:mm:ss. Because years and months have different numbers of days, rather than specifying an offset, we actually specify two dates for this option - the first being the date to translate to, relative to the second.
So if a particular photo was taken on the 29th February 2012 at 8:21am, but the camera recorded it as the 1st January 2000 at 2:24pm, we would use the following.
jhead -da2012:02:29/08:21-2000:01:01/14:24 *.jpg
It doesn't matter that the photos weren't all taken at the very same time specified by either date in this argument, Jhead will just work out the correct offset to use from the before and after dates and apply it correctly to each photo individually.
Setting the File System's Timestamp
This is not strictly necessary but can be useful if you want your file system's file creation dates to now match those of the newly fixed EXIF dates.
jhead -ft *.jpg
Additonal Options
Jhead can also perform some other useful tasks such as image rotation in accordance with the image's orientation tag, extracting camera settings, displaying embedded GPS info, etc. Check out it's full list of command line options to learn more.