ExifTool is the one to go for.
It has a time shift feature that allows you to shift the dates.
Date/Time Shift Feature
Have you ever forgotten to set the date/time on your digital camera
before taking a bunch of pictures? ExifTool has a time shift feature
that makes it easy to apply a batch fix to the timestamps of the
images (ie. change the "Date Picture Taken" reported by Windows
Explorer). Say for example that your camera clock was reset to
2000:01:01 00:00:00 when you put in a new battery at
2005:11:03 10:48:00. Then all of the pictures you took subsequently
have timestamps that are wrong by 5 years, 10 months, 2 days, 10 hours
and 48 minutes. To fix this, put all of the images in the same
directory ("DIR") and run exiftool:
exiftool "-DateTimeOriginal+=5:10:2 10:48:0" DIR
The example above changes only the DateTimeOriginal tag, but any
writable date or time tag can be shifted, and multiple tags may be
written with a single command line. Commonly, in JPEG images, the
DateTimeOriginal, CreateDate and ModifyDate values must all be
changed. For convenience, a shortcut tag called AllDates has been
defined to represent these three tags. So, for example, if you forgot
to set your camera clock back 1 hour at the end of daylight savings
time in the fall, you can fix the images with:
exiftool -AllDates-=1 DIR
See Image::ExifTool::Shift.pl (download in PDF format) for
details about the syntax of the time shift string.
Some things to note:
Test on a small batch of copies first until you get the date syntax you want.
I suggest you copy or move your images to a new folder first.
And run the command on that directory.
If you run exiftool on a directory it will look in sub directories and modify any image files it finds.
Exiftool WILL automatically append '_original' on the end of your original files and create a new copy for you with the modifications.
You can override this by using the '-overwrite_original' option.
exiftool -overwrite_original -AllDates+="0:2:1 10:48:0" /Users/UserName/Desktop/testFolder
This example shifts forward 0 years, 2 months, 1 day, 10 hours, 48 minutes, 0 seconds.
Using a single set of time shifts i.e instead of "0:2:1 10:48:0" you use "10:48:0".
Exiftool will see this as hh:mm:ss.
And you can omit 0 where you do not want to put a shift.
exiftool -overwrite_original AllDates+="9::" /Users/UserName/Desktop/testFolder
This example shifts forward 9 hours.
exiftool -overwrite_original -AllDates-="9::" /Users/UserName/Desktop/testFolder
This example shifts back 9 hours.
Notice AllDates-=" and AllDates+=" , one has a plus one has a minus.
Also Remember you are shifting time not stamping a time stamp.
So if my original date was :
2011:07:21 01:41:29
and I used exiftool -overwrite_original -AllDates-="24::" /Users/UserName/Desktop/testFolder
Then I would get : 2011:07:20 01:41:29
Do download the PDF with the syntax
And make sure you look at the difference with the options -overwrite_original_in_place and -overwrite_original
Documentation