Skip to content

Commit

Permalink
Actually fix the strptime tests
Browse files Browse the repository at this point in the history
This has been a complicated issue to fix for a number of reasons.
The core of it is that the behavior is different between different
versions of macOS, some of which set possible-but-incorrect values.

This commit addresses the issue by always using our computation for
tm_wday and tm_yday on macOS. As a side-effect, strptime format
strings that specify %u and %j will no longer work on macOS.
  • Loading branch information
wtlangford committed Nov 30, 2017
1 parent 476b367 commit 0c9eace
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 3 deletions.
3 changes: 2 additions & 1 deletion docs/content/3.manual/manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1933,7 +1933,8 @@ sections:
8601 datetime is `"%Y-%m-%dT%H:%M:%SZ"`.
jq may not support some or all of this date functionality on
some systems.
some systems. In particular, the `%u` and `%j` specifiers for
`strptime(fmt)` are not supported on macOS.
examples:
- program: 'fromdate'
Expand Down
13 changes: 13 additions & 0 deletions src/builtin.c
Original file line number Diff line number Diff line change
Expand Up @@ -1313,10 +1313,23 @@ static jv f_strptime(jq_state *jq, jv a, jv b) {
* day-of-week and day-of-year sentinel checks above, the worst
* this can do is produce garbage.
*/
#ifdef __APPLE__
/*
* Apple has made it worse, and different versions of the OS have different
* behaviors. Some versions just don't touch the fields, but others do, and
* sometimes provide wrong answers, at that! We can't tell at compile-time
* which behavior the target system will have, so instead we always use our
* functions to set these on OS X, and document that %u and %j are
* unsupported on OS X.
*/
set_tm_wday(&tm);
set_tm_yday(&tm);
#else
if (tm.tm_wday == 8 && tm.tm_mday != 0 && tm.tm_mon >= 0 && tm.tm_mon <= 11)
set_tm_wday(&tm);
if (tm.tm_yday == 367 && tm.tm_mday != 0 && tm.tm_mon >= 0 && tm.tm_mon <= 11)
set_tm_yday(&tm);
#endif
jv r = tm2jv(&tm);
if (*end != '\0')
r = jv_array_append(r, jv_string(end));
Expand Down
5 changes: 3 additions & 2 deletions tests/optional.test
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@

# Check day-of-week and day of year computations
# (should trip an assert if this fails)
last(range(365 * 199)|("1970-03-01T01:02:03Z"|strptime("%Y-%m-%dT%H:%M:%SZ")|mktime) + (86400 * .)|strftime("%Y-%m-%dT%H:%M:%SZ")|strptime("%Y-%m-%dT%H:%M:%SZ"))
# This date range
last(range(365 * 67)|("1970-03-01T01:02:03Z"|strptime("%Y-%m-%dT%H:%M:%SZ")|mktime) + (86400 * .)|strftime("%Y-%m-%dT%H:%M:%SZ")|strptime("%Y-%m-%dT%H:%M:%SZ"))
null
[2169,0,10,1,2,3,1,9]
[2037,1,11,1,2,3,3,41]

# %e is not available on mingw/WIN32
strftime("%A, %B %e, %Y")
Expand Down

0 comments on commit 0c9eace

Please sign in to comment.