在C字符串中更改日期

时间:2018-12-01 13:38:23

标签: c

我需要在“ 25/04/1889”中更改日期,例如“ 1889年4月25日”(或俄语中的“ 25апреля1889”)。 我有一个用于更改struct中日期的函数,但是gcc print wcsptime()具有隐式声明(我包括了(?<!,\s+)"(?!\s+,$) <wchar.h>):

<time.h>

有什么方法可以将这个日期转换成需要的格式?使用struct tm和standart函数? 更改“文本”的结构如下所示:

void change_date(text_s *text, int numb_of_str, int beg_of_word, int length_month){
    wchar_t *temp = malloc(20 * sizeof(wchar_t));
    const int length_start = 8 + length_month;
    wcsncpy(temp, &text->sent[numb_of_str].str[beg_of_word], length_start);
    temp[length_start - 1] = L'\0';
    struct tm new_time;
    wcsptime(temp, L"%d %B %Y", new_time);
}

1 个答案:

答案 0 :(得分:1)

无法编译代码的原因是因为wcsptime()不属于C标准库。但是,在您的特定情况下,它相对容易实现(并且您说过要坚持使用标准库):

int wstr_to_tm(const wchar_t* str, struct tm* tm)
{
    wchar_t mon[64];
    int i;
    static const wchar_t *months[] = { 
        L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", 
        L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec" 
    };
    if(wcslen(str) > sizeof(mon)/2) return 0;
    if(swscanf(str, L"%u %ls %u", &tm->tm_mday, mon, &tm->tm_year) != 3)
        return 0;
    for(i = 0; i < 12; ++i)
    {
        if(wcsncmp(months[i], mon, wcslen(months[i])) == 0)
        {
            tm->tm_mon = i;
            break;
        }

    }
    return tm->tm_mon >= 0;
}

要转换为所需的字符串格式,您需要执行以下操作:

wchar_t* date = L"12 Oct 1966";
struct tm tm = {0};
if(wstr_to_tm(date, &tm))
    wprintf(L"%d/%d/%d\n", tm.tm_mday, tm.tm_mon, tm.tm_year);

您将需要添加俄语和您需要支持的任何其他语言的月份名称,然后根据当前语言环境进行比较。