【发布时间】:2017-04-07 10:57:03
【问题描述】:
我正在使用strptime(3) 来解析代表日期的字符串:
#include <time.h>
#include <stdio.h>
int main () {
struct tm t;
strptime("2015-04-19 12:00:00", "%F %T", &t); /* Sunday */
printf("%d\n", t.tm_wday); /* Should print 0 */
return 0;
}
根据cal -y 2015 的输出,该日期是星期日。但是当我在 OSX 上编译它时(大概是用 clang)它会打印出6:
$ gcc timetest.c ; ./a.out
6
而在 Debian 上它会打印(正确的)0:
$ gcc timetest.c ; ./a.out
0
有什么不同的解释吗?
更新
这是相同的程序,除了 t 使用有效时间初始化并且我报告了 strptime() 的返回值:
#include <time.h>
#include <stdio.h>
int main () {
time_t epoch = 0;
struct tm t;
char *ret;
t = *localtime(&epoch);
ret = strptime("2015-04-19 12:00:00", "%F %T", &t); /* Sunday */
printf("%d\n", t.tm_wday); /* Should print 0 */
printf("strptime() returned %p (%d)\n", ret, *ret);
return 0;
}
这是输出:
$ gcc timetest.c ; ./a.out
6
strptime() returned 0x10c72af83 (0)
这是我使用的clang 版本:
$ clang -v
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
【问题讨论】:
-
OSX 上 strptime() 的返回值是多少?在调用 strptime() 之前使用有效日期初始化
t会发生什么? -
我已经根据@Jens 的建议更新了程序。
-
它在 OS X 上给我 0。
clang-700.1.81 -
逐字记录代码并在 macOS Sierra 10.12.1 上运行(使用 GCC 6.2.0 或 XCode 8.0 中的 Clang),我得到了结果 6。我在后面添加了两行:
time_t rt = mktime(&t);打电话给strptime()和printf("%lld\n", (long long)rt);,结果变成了0。现在,对此,我没有解释! -
@JonathanLeffler 对,我可以确认,在拨打
strptime()之后再拨打mktime()对我来说是一个可用的解决方法。但我无法解释观察到的行为。