summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-10-24 20:44:22 +0100
committerCarl Hetherington <cth@carlh.net>2016-10-24 20:44:22 +0100
commit079d5cae5c0dfbbd5b683c4e7148119de5f9b47d (patch)
tree3c142db909314dfc59afcf67c182cf83d4355ada /src
parent7f6314d6efdc3acec9587eb53b78b59cd6475de8 (diff)
Allow LocalTime without a timezone offset.
Diffstat (limited to 'src')
-rw-r--r--src/local_time.cc59
1 files changed, 36 insertions, 23 deletions
diff --git a/src/local_time.cc b/src/local_time.cc
index ee5db5de..8a009209 100644
--- a/src/local_time.cc
+++ b/src/local_time.cc
@@ -109,22 +109,45 @@ LocalTime::set_local_time_zone ()
_tz_minute = offset.minutes ();
}
-/** @param s A string of the form 2013-01-05T18:06:59[.123]+04:00 */
+/** @param s A string of the form 2013-01-05T18:06:59[.123][+04:00] */
LocalTime::LocalTime (string s)
{
- /* 2013-01-05T18:06:59+04:00 or 2013-01-05T18:06:59.123+04:00 */
- /* 0123456789012345678901234 or 01234567890123456789012345678 */
+ /* 2013-01-05T18:06:59 or 2013-01-05T18:06:59.123 or 2013-01-05T18:06:59+04:00 or 2013-01-05T18:06:59.123+04:00 */
+ /* 0123456789012345678 or 01234567890123456789012 or 0123456789012345678901234 or 01234567890123456789012345678 */
- if (s.length() < 25) {
+ if (s.length() < 19) {
throw TimeFormatError (s);
}
- /* Check incidental characters */
- bool const common = s[4] == '-' && s[7] == '-' && s[10] == 'T' && s[13] == ':' && s[16] == ':';
- bool const without_millisecond = common && s[22] == ':';
- bool const with_millisecond = common && s[19] == '.' && s[26] == ':';
+ bool with_millisecond = false;
+ bool with_tz = false;
+
+ switch (s.length ()) {
+ case 19:
+ break;
+ case 23:
+ with_millisecond = true;
+ break;
+ case 25:
+ with_tz = true;
+ break;
+ case 29:
+ with_millisecond = with_tz = true;
+ break;
+ default:
+ throw TimeFormatError (s);
+ }
+
+ int const tz_pos = with_millisecond ? 23 : 19;
- if (!with_millisecond && !without_millisecond) {
+ /* Check incidental characters */
+ if (s[4] != '-' || s[7] != '-' || s[10] != 'T' || s[13] != ':' || s[16] != ':') {
+ throw TimeFormatError (s);
+ }
+ if (with_millisecond && s[19] != '.') {
+ throw TimeFormatError (s);
+ }
+ if (with_tz && s[tz_pos] != '+' && s[tz_pos] != '-') {
throw TimeFormatError (s);
}
@@ -134,22 +157,12 @@ LocalTime::LocalTime (string s)
_hour = lexical_cast<int> (s.substr (11, 2));
_minute = lexical_cast<int> (s.substr (14, 2));
_second = lexical_cast<int> (s.substr (17, 2));
- if (without_millisecond) {
- _millisecond = 0;
- _tz_hour = lexical_cast<int> (s.substr (20, 2));
- _tz_minute = lexical_cast<int> (s.substr (23, 2));
- } else {
- _millisecond = lexical_cast<int> (s.substr (20, 3));
- _tz_hour = lexical_cast<int> (s.substr (24, 2));
- _tz_minute = lexical_cast<int> (s.substr (27, 2));
- }
-
- int const plus_minus_position = with_millisecond ? 23 : 19;
+ _millisecond = with_millisecond ? lexical_cast<int> (s.substr (20, 3)) : 0;
+ _tz_hour = with_tz ? lexical_cast<int> (s.substr (tz_pos + 1, 2)) : 0;
+ _tz_minute = with_tz ? lexical_cast<int> (s.substr (tz_pos + 4, 2)) : 0;
- if (s[plus_minus_position] == '-') {
+ if (with_tz && s[tz_pos] == '-') {
_tz_hour = -_tz_hour;
- } else if (s[plus_minus_position] != '+') {
- throw TimeFormatError (s);
}
}