我需要在“ 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);
}
答案 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);
您将需要添加俄语和您需要支持的任何其他语言的月份名称,然后根据当前语言环境进行比较。