Commit 8fbc8579f2481dc3eeb962e99522047291e16fbe
1 parent
df067c9a
Allow zone information to be omitted from timestamp strings
Showing
3 changed files
with
9 additions
and
4 deletions
include/qpdf/QUtil.hh
| @@ -203,8 +203,9 @@ namespace QUtil | @@ -203,8 +203,9 @@ namespace QUtil | ||
| 203 | 203 | ||
| 204 | // Convert a QPDFTime structure to a PDF timestamp string, which | 204 | // Convert a QPDFTime structure to a PDF timestamp string, which |
| 205 | // is "D:yyyymmddhhmmss<z>" where <z> is either "Z" for UTC or | 205 | // is "D:yyyymmddhhmmss<z>" where <z> is either "Z" for UTC or |
| 206 | - // "-hh'mm'" or "+hh'mm'" for timezone offset. Examples: | ||
| 207 | - // "D:20210207161528-05'00'", "D:20210207211528Z". See | 206 | + // "-hh'mm'" or "+hh'mm'" for timezone offset. <z> may also be |
| 207 | + // omitted. Examples: "D:20210207161528-05'00'", | ||
| 208 | + // "D:20210207211528Z", "D:20210207211528". See | ||
| 208 | // get_current_qpdf_time and the QPDFTime structure above. | 209 | // get_current_qpdf_time and the QPDFTime structure above. |
| 209 | QPDF_DLL | 210 | QPDF_DLL |
| 210 | std::string qpdf_time_to_pdf_time(QPDFTime const&); | 211 | std::string qpdf_time_to_pdf_time(QPDFTime const&); |
libqpdf/QUtil.cc
| @@ -898,7 +898,7 @@ QUtil::pdf_time_to_qpdf_time(std::string const& str, QPDFTime* qtm) | @@ -898,7 +898,7 @@ QUtil::pdf_time_to_qpdf_time(std::string const& str, QPDFTime* qtm) | ||
| 898 | { | 898 | { |
| 899 | static std::regex pdf_date("^D:([0-9]{4})([0-9]{2})([0-9]{2})" | 899 | static std::regex pdf_date("^D:([0-9]{4})([0-9]{2})([0-9]{2})" |
| 900 | "([0-9]{2})([0-9]{2})([0-9]{2})" | 900 | "([0-9]{2})([0-9]{2})([0-9]{2})" |
| 901 | - "(?:(Z)|([\+\-])([0-9]{2})'([0-9]{2})')$"); | 901 | + "(?:(Z?)|([\+\-])([0-9]{2})'([0-9]{2})')$"); |
| 902 | std::smatch m; | 902 | std::smatch m; |
| 903 | if (! std::regex_match(str, m, pdf_date)) | 903 | if (! std::regex_match(str, m, pdf_date)) |
| 904 | { | 904 | { |
| @@ -909,7 +909,7 @@ QUtil::pdf_time_to_qpdf_time(std::string const& str, QPDFTime* qtm) | @@ -909,7 +909,7 @@ QUtil::pdf_time_to_qpdf_time(std::string const& str, QPDFTime* qtm) | ||
| 909 | return QUtil::string_to_int(s.c_str()); | 909 | return QUtil::string_to_int(s.c_str()); |
| 910 | }; | 910 | }; |
| 911 | 911 | ||
| 912 | - if (m[7] == "") | 912 | + if (m[8] != "") |
| 913 | { | 913 | { |
| 914 | tz_delta = ((to_i(m[9]) * 60) + | 914 | tz_delta = ((to_i(m[9]) * 60) + |
| 915 | to_i(m[10])); | 915 | to_i(m[10])); |
libtests/qutil.cc
| @@ -594,6 +594,10 @@ void timestamp_test() | @@ -594,6 +594,10 @@ void timestamp_test() | ||
| 594 | check(QUtil::QPDFTime(2021, 2, 10, 1, 19, 25, -330)); | 594 | check(QUtil::QPDFTime(2021, 2, 10, 1, 19, 25, -330)); |
| 595 | check(QUtil::QPDFTime(2021, 2, 9, 19, 19, 25, 0)); | 595 | check(QUtil::QPDFTime(2021, 2, 9, 19, 19, 25, 0)); |
| 596 | assert(! QUtil::pdf_time_to_qpdf_time("potato")); | 596 | assert(! QUtil::pdf_time_to_qpdf_time("potato")); |
| 597 | + assert(QUtil::pdf_time_to_qpdf_time("D:20210211064743Z")); | ||
| 598 | + assert(QUtil::pdf_time_to_qpdf_time("D:20210211064743-05'00'")); | ||
| 599 | + assert(QUtil::pdf_time_to_qpdf_time("D:20210211064743+05'30'")); | ||
| 600 | + assert(QUtil::pdf_time_to_qpdf_time("D:20210211064743")); | ||
| 597 | // Round trip on the current time without actually printing it. | 601 | // Round trip on the current time without actually printing it. |
| 598 | // Manual testing was done to ensure that we are actually getting | 602 | // Manual testing was done to ensure that we are actually getting |
| 599 | // back the current time in various timezones. | 603 | // back the current time in various timezones. |