mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Time: Add support for variable number of millisecond digits in ISO8601 format
This commit is contained in:
parent
ea37e71f87
commit
4212720f7d
1 changed files with 64 additions and 8 deletions
|
|
@ -435,19 +435,27 @@ String Time::toISO8601 (bool includeDividerCharacters) const
|
||||||
+ getUTCOffsetString (includeDividerCharacters);
|
+ getUTCOffsetString (includeDividerCharacters);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parseFixedSizeIntAndSkip (String::CharPointerType& t, int numChars, char charToSkip) noexcept
|
static int parseVariableSizeIntAndSkip (String::CharPointerType& t,
|
||||||
|
int minNumChars,
|
||||||
|
int targetNumChars,
|
||||||
|
char charToSkip) noexcept
|
||||||
{
|
{
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
for (int i = numChars; --i >= 0;)
|
for (int i = 0; i < targetNumChars; ++i)
|
||||||
{
|
{
|
||||||
auto digit = (int) (*t - '0');
|
n *= 10;
|
||||||
|
const auto digit = (int) (*t - '0');
|
||||||
if (! isPositiveAndBelow (digit, 10))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
|
if (isPositiveAndBelow (digit, 10))
|
||||||
|
{
|
||||||
|
n += digit;
|
||||||
++t;
|
++t;
|
||||||
n = n * 10 + digit;
|
}
|
||||||
|
else if (i < minNumChars)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (charToSkip != 0 && *t == (juce_wchar) charToSkip)
|
if (charToSkip != 0 && *t == (juce_wchar) charToSkip)
|
||||||
|
|
@ -456,6 +464,11 @@ static int parseFixedSizeIntAndSkip (String::CharPointerType& t, int numChars, c
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int parseFixedSizeIntAndSkip (String::CharPointerType& t, int numChars, char charToSkip) noexcept
|
||||||
|
{
|
||||||
|
return parseVariableSizeIntAndSkip (t, numChars, numChars, charToSkip);
|
||||||
|
}
|
||||||
|
|
||||||
Time Time::fromISO8601 (StringRef iso)
|
Time Time::fromISO8601 (StringRef iso)
|
||||||
{
|
{
|
||||||
auto t = iso.text;
|
auto t = iso.text;
|
||||||
|
|
@ -515,13 +528,16 @@ Time Time::fromISO8601 (StringRef iso)
|
||||||
if (*t == '.' || *t == ',')
|
if (*t == '.' || *t == ',')
|
||||||
{
|
{
|
||||||
++t;
|
++t;
|
||||||
milliseconds = parseFixedSizeIntAndSkip (t, 3, 0);
|
milliseconds = parseVariableSizeIntAndSkip (t, 1, 3, 0);
|
||||||
|
|
||||||
if (milliseconds < 0)
|
if (milliseconds < 0)
|
||||||
{
|
{
|
||||||
jassertfalse;
|
jassertfalse;
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// skip to the next non-digit character
|
||||||
|
while (t.isDigit()) { ++t; }
|
||||||
}
|
}
|
||||||
|
|
||||||
milliseconds += 1000 * seconds;
|
milliseconds += 1000 * seconds;
|
||||||
|
|
@ -701,6 +717,46 @@ public:
|
||||||
expect (Time::fromISO8601 ("20160216T150357.999-0230") == Time (2016, 1, 16, 17, 33, 57, 999, false));
|
expect (Time::fromISO8601 ("20160216T150357.999-0230") == Time (2016, 1, 16, 17, 33, 57, 999, false));
|
||||||
expect (Time::fromISO8601 ("20160216T150357,999-0230") == Time (2016, 1, 16, 17, 33, 57, 999, false));
|
expect (Time::fromISO8601 ("20160216T150357,999-0230") == Time (2016, 1, 16, 17, 33, 57, 999, false));
|
||||||
|
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.9+00:00") == Time (2016, 1, 16, 15, 3, 57, 900, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.9+0000") == Time (2016, 1, 16, 15, 3, 57, 900, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.9Z") == Time (2016, 1, 16, 15, 3, 57, 900, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57,9Z") == Time (2016, 1, 16, 15, 3, 57, 900, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.9Z") == Time (2016, 1, 16, 15, 3, 57, 900, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357,9Z") == Time (2016, 1, 16, 15, 3, 57, 900, false));
|
||||||
|
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.9-02:30") == Time (2016, 1, 16, 17, 33, 57, 900, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57,9-02:30") == Time (2016, 1, 16, 17, 33, 57, 900, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.9-0230") == Time (2016, 1, 16, 17, 33, 57, 900, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357,9-0230") == Time (2016, 1, 16, 17, 33, 57, 900, false));
|
||||||
|
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.99+00:00") == Time (2016, 1, 16, 15, 3, 57, 990, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.99+0000") == Time (2016, 1, 16, 15, 3, 57, 990, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.99Z") == Time (2016, 1, 16, 15, 3, 57, 990, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57,99Z") == Time (2016, 1, 16, 15, 3, 57, 990, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.99Z") == Time (2016, 1, 16, 15, 3, 57, 990, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357,99Z") == Time (2016, 1, 16, 15, 3, 57, 990, false));
|
||||||
|
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.99-02:30") == Time (2016, 1, 16, 17, 33, 57, 990, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57,99-02:30") == Time (2016, 1, 16, 17, 33, 57, 990, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.99-0230") == Time (2016, 1, 16, 17, 33, 57, 990, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357,99-0230") == Time (2016, 1, 16, 17, 33, 57, 990, false));
|
||||||
|
|
||||||
|
// The 8601 standard appears to support any number of fractional digits.
|
||||||
|
// The fractional part should either be rounded or truncated.
|
||||||
|
// The Time class stores time with millisecond precision.
|
||||||
|
// Most implementations appear to truncate so that's what we test for too.
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.9999+00:00") == Time (2016, 1, 16, 15, 3, 57, 999, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.999999999+0000") == Time (2016, 1, 16, 15, 3, 57, 999, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.999999999Z") == Time (2016, 1, 16, 15, 3, 57, 999, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57,999999999Z") == Time (2016, 1, 16, 15, 3, 57, 999, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.9999999999999Z") == Time (2016, 1, 16, 15, 3, 57, 999, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357,9999999999999Z") == Time (2016, 1, 16, 15, 3, 57, 999, false));
|
||||||
|
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57.9999-02:30") == Time (2016, 1, 16, 17, 33, 57, 999, false));
|
||||||
|
expect (Time::fromISO8601 ("2016-02-16T15:03:57,9999-02:30") == Time (2016, 1, 16, 17, 33, 57, 999, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357.999999999-0230") == Time (2016, 1, 16, 17, 33, 57, 999, false));
|
||||||
|
expect (Time::fromISO8601 ("20160216T150357,999999999-0230") == Time (2016, 1, 16, 17, 33, 57, 999, false));
|
||||||
|
|
||||||
expect (Time (1970, 0, 1, 0, 0, 0, 0, false) == Time (0));
|
expect (Time (1970, 0, 1, 0, 0, 0, 0, false) == Time (0));
|
||||||
expect (Time (2106, 1, 7, 6, 28, 15, 0, false) == Time (4294967295000));
|
expect (Time (2106, 1, 7, 6, 28, 15, 0, false) == Time (4294967295000));
|
||||||
expect (Time (2007, 10, 7, 1, 7, 20, 0, false) == Time (1194397640000));
|
expect (Time (2007, 10, 7, 1, 7, 20, 0, false) == Time (1194397640000));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue