日期时间解析的C库

8

您是否了解C语言的日期解析函数?我正在寻找类似以下的内容:

time = parse_time("9/10/2009");
printf("%d\n", time->date);
time2 = parse_time("Monday September 10th 2009")    
time2 = parse_time("Monday September 10th 2009 12:30 AM")

谢谢您


正如blak3r在评论中提到的那样,您的规范存在歧义。在第一个例子中,日期可以被解析为9月10日或10月9日,具体取决于您所在的国家/地区。您必须指定一个格式。 - bortzmeyer
9个回答

12

在C语言中,有两种常见的方法:

  1. 使用支持的格式数组以strptime()方法处理。

  2. 频繁敲头撞桌子,然后要么放弃,要么转向已经有可用库的其他语言(例如Perl或Python)。


6
如果格式是一致的,您可以使用scanf系列函数。
#include<stdio.h>

int main()
{
    char *data = "Tue, 13 Dec 2011 16:08:21 GMT";
    int h, m, s, d, Y;
    char M[4];
    sscanf(data, "%*[a-zA-Z,] %d %s %d %d:%d%:%d", &d, M, &Y, &h, &m, &s);
    return 0;
}

3

很遗憾,标准库中唯一的东西是由POSIX定义而非C标准的getdate()。它可以处理许多时间格式,但您需要事先知道格式,而不能只将通用字符串传递给函数。

如果这对您有影响,它在Visual C++上也没有支持。然而,GNU C运行时支持此例程。


有没有任何不在标准和可移植的东西? - adk

2
Git提供了一个便携的日期解析库date parsing library,使用GPLv2发布。您可能可以使用它。我认为你想要的是approxidate_careful()函数。

2

朱利安图书馆可以完成你所需的大部分功能,特别是要看看它的解析是如何工作的。但我认为它可能无法完全满足你的要求(我相信星期一会让它晕头转向;-)。


1

0
在 Windows 中,有 VarDateFromStr 函数,如果像这样使用,它可以自动解析许多格式:
LPCWSTR dateString = L"
DATE result;
HRESULT hr = ::VarDateFromStr(dateString,
                              LOCALE_ALL,
                              0,
                              &result);

if (FAILED(hr))
{
    /* handle error */
    /* DISP_E_TYPEMISMATCH means that it didn't recognize the format. */
}

它通常可以识别数字格式,但也可以解析“2009年9月10日上午12:30”,不需要星期一,在我的德语计算机上也不需要th,但这可能取决于区域设置。单词必须使用本地语言,例如,在英语系统上需要“June”,但在德语系统上需要“Juni”。


0
在 time.h 中有 strptime 函数:
// Scan values from buf string into tptr struct. On success it returns pointer
// to the character following the last character parsed. Otherwise it returns null.
char * strptime(const char* buf, const char* format, struct tm* tptr)

这个函数执行与之相反的操作

// Format tm into a date/time string.
size t strftime(char* s, size t n, const char* format, const struct tm* tptr)

点击此处查看完整的维基百科参考资料


如果我不知道格式怎么办? - adk
1
@adk 嗯...好吧,你需要给出一些指示,以便它知道你是输入月份、日期还是年份...你知道的。但是,你可以尝试使用多种格式解析给定的输入字符串,并不断尝试,直到函数不返回 null 为止。 - blak3r
@Mitch Wheat - 不知道VC++,你有检查ctime吗? - blak3r

0

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - djhaskin987
@djhaskin987 将答案稍微改进了一下,但除了指向代码的权威来源之外,几乎没有更多必要的信息可以添加。这怎么可能比那两个得到赞同的回答更糟呢? - Jani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接