diff --git a/man/man1/exiv2.1 b/man/man1/exiv2.1 index 4bf17abf..171bdc5f 100644 --- a/man/man1/exiv2.1 +++ b/man/man1/exiv2.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH EXIV2 1 "March 28, 2020" +.TH EXIV2 1 "April 25, 2020" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -271,12 +271,14 @@ options. Set the file timestamp according to the Exif create timestamp in addition to renaming the file (overrides \fB\-k\fP). This option is only used with the 'rename' action. +See Exif DateTime below for additional information. .TP .B \-T Only set the file timestamp according to the Exif create timestamp, do not rename the file (overrides \fB\-k\fP). This option is only used with the 'rename' action. Note: On Windows you may have to set the TZ environment variable for this option to work correctly. +See Exif DateTime below for additional information. .TP .B \-f,\-F These options are used by the commands 'rename' and 'extract' to @@ -327,6 +329,7 @@ Default filename format is %Y%m%d_%H%M%S. Time adjustment in the format [\-]HH[:MM[:SS]]. This option is only used with the 'adjust' action. Examples: 1 adds one hour, 1:01 adds one hour and one minute, \-0:00:30 subtracts 30 seconds. +See Exif DateTime below for additional information. .TP .B \-Y \fIyrs\fP Time adjustment by a positive or negative number of years, for @@ -622,6 +625,16 @@ To register additional XMP namespaces, combine the command with: .nf \fBreg\fP \fIprefix\fP \fInamespace\fP .br +.SS Exif DateTime +.fi +An Exif DateTime string is stored as 20 ascii bytes (including trailing nul) in the format: +.sp 1 +YYYY:MM:DD HH:MM:SS +.sp 1 +The exiv2 command-line program options -t and -T will accept files +in which the Date has been incorrectly stored as YYYY-MM-DD. +The option -a enables the user to adjust the DateTime in the file and applies +the YYYY:MM:DD HH:MM:SS standard. .ne 4 .fi .SS Command file format diff --git a/src/actions.cpp b/src/actions.cpp index 8350fd4c..e0005030 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -1971,7 +1971,7 @@ namespace { { if (timeStr.length() == 0 || timeStr[0] == ' ') return 1; if (timeStr.length() < 19) return 2; - if ( timeStr[4] != ':' || timeStr[7] != ':' || timeStr[10] != ' ' + if ( (timeStr[4] != ':' && timeStr[4] != '-') || (timeStr[7] != ':' && timeStr[7] != '-') || timeStr[10] != ' ' || timeStr[13] != ':' || timeStr[16] != ':') return 3; if (0 == tm) return 4; std::memset(tm, 0x0, sizeof(struct tm)); diff --git a/test/data/test_issue_1180.exv b/test/data/test_issue_1180.exv new file mode 100644 index 00000000..aa68e8be Binary files /dev/null and b/test/data/test_issue_1180.exv differ diff --git a/tests/bugfixes/github/test_issue_1180.py b/tests/bugfixes/github/test_issue_1180.py new file mode 100644 index 00000000..271e272b --- /dev/null +++ b/tests/bugfixes/github/test_issue_1180.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, CopyTmpFiles, path +@CopyTmpFiles("$data_path/test_issue_1180.exv") + +class test_issue_1180Test(metaclass=CaseMeta): + + filename = path("$tmp_path/test_issue_1180.exv") + dash_t = path("$tmp_path/20200424_174415.exv") # -t renames file + dash_T = path("$tmp_path/20200424_154415.exv") # -T renames file + commands = [ "$exiv2 -K Exif.Image.DateTime $filename" + , "$exiv2 -t --force $filename" + , "$exiv2 -K Exif.Image.DateTime $dash_t" + , "$exiv2 -a -02:00 --force $dash_t" + , "$exiv2 -K Exif.Image.DateTime $dash_t" + , "$exiv2 -t --force $dash_t" + , "$exiv2 -K Exif.Image.DateTime $dash_T" + ] + stdout = ["Exif.Image.DateTime Ascii 50 2020-04-24 17:44:15 \n" + ,"" + ,"Exif.Image.DateTime Ascii 50 2020-04-24 17:44:15 \n" + ,"" + ,"Exif.Image.DateTime Ascii 20 2020:04:24 15:44:15\n" + ,"" + ,"Exif.Image.DateTime Ascii 20 2020:04:24 15:44:15\n" + ] + stderr = [""]*len(commands) + retval = [ 0]*len(commands) diff --git a/tests/suite.conf b/tests/suite.conf index a6006d12..1fb9e65b 100644 --- a/tests/suite.conf +++ b/tests/suite.conf @@ -14,6 +14,7 @@ exiv2_path: ../build/bin exiv2: ${ENV:exiv2_path}/exiv2${ENV:binary_extension} exiv2json: ${ENV:exiv2_path}/exiv2json${ENV:binary_extension} data_path: ../test/data +tmp_path: ../test/tmp tiff_test: ${ENV:exiv2_path}/tiff-test${ENV:binary_extension} largeiptc_test: ${ENV:exiv2_path}/largeiptc-test${ENV:binary_extension} easyaccess_test: ${ENV:exiv2_path}/easyaccess-test${ENV:binary_extension} diff --git a/tests/system_tests.py b/tests/system_tests.py index faca639e..7a8b00e6 100644 --- a/tests/system_tests.py +++ b/tests/system_tests.py @@ -460,7 +460,27 @@ class CopyFiles(FileDecoratorBase): fname, ext = os.path.splitext(expanded_file_name) new_name = fname + '_copy' + ext return shutil.copyfile(expanded_file_name, new_name) + +class CopyTmpFiles(FileDecoratorBase): + """ + This class copies files from test/data to test/tmp + Copied files are NOT removed in tearDown + Example: @CopyTmpFiles("$data_path/test_issue_1180.exv") + """ + + #: override the name of the file list + FILE_LIST_NAME = '_tmp_files' + + def setUp_file_action(self, expanded_file_name): + fname, ext = os.path.splitext(expanded_file_name) + tmp_dir = os.path.join(os.path.dirname(os.path.dirname(expanded_file_name)),'tmp') + tmp_name = os.path.join(tmp_dir,os.path.basename(expanded_file_name)) + return shutil.copyfile(expanded_file_name, tmp_name) + def tearDown_file_action(self, f): + """ + Do nothing. We don't clean up TmpFiles + """ class DeleteFiles(FileDecoratorBase): """