Actually fix the strptime tests
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.
This commit is contained in:
1 parent
476b36770d
commit
0c9eacedaa
3 files changed
+18
-3
No files matched your search
@@ -1933,7 +1933,8 @@ sections:
|
|||||||
8601 datetime is `"%Y-%m-%dT%H:%M:%SZ"`.
|
8601 datetime is `"%Y-%m-%dT%H:%M:%SZ"`.
|
||||||
|
|
||||||
jq may not support some or all of this date functionality on
|
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:
|
examples:
|
||||||
- program: 'fromdate'
|
- program: 'fromdate'
|
||||||
|
|||||||
@@ -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
|
* day-of-week and day-of-year sentinel checks above, the worst
|
||||||
* this can do is produce garbage.
|
* 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)
|
if (tm.tm_wday == 8 && tm.tm_mday != 0 && tm.tm_mon >= 0 && tm.tm_mon <= 11)
|
||||||
set_tm_wday(&tm);
|
set_tm_wday(&tm);
|
||||||
if (tm.tm_yday == 367 && tm.tm_mday != 0 && tm.tm_mon >= 0 && tm.tm_mon <= 11)
|
if (tm.tm_yday == 367 && tm.tm_mday != 0 && tm.tm_mon >= 0 && tm.tm_mon <= 11)
|
||||||
set_tm_yday(&tm);
|
set_tm_yday(&tm);
|
||||||
|
#endif
|
||||||
jv r = tm2jv(&tm);
|
jv r = tm2jv(&tm);
|
||||||
if (*end != '\0')
|
if (*end != '\0')
|
||||||
r = jv_array_append(r, jv_string(end));
|
r = jv_array_append(r, jv_string(end));
|
||||||
|
|||||||
+3
-2
@@ -7,9 +7,10 @@
|
|||||||
|
|
||||||
# Check day-of-week and day of year computations
|
# Check day-of-week and day of year computations
|
||||||
# (should trip an assert if this fails)
|
# (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
|
null
|
||||||
[2169,0,10,1,2,3,1,9]
|
[2037,1,11,1,2,3,3,41]
|
||||||
|
|
||||||
# %e is not available on mingw/WIN32
|
# %e is not available on mingw/WIN32
|
||||||
strftime("%A, %B %e, %Y")
|
strftime("%A, %B %e, %Y")
|
||||||
|
|||||||
Reference in new issue
Block a user