如何将日期格式:2019-08-22 16:16:08]转换为C语言格式:aammjjhhmmss

How to convert a date format: 2019-08-22 16:16:08] to the format: aammjjhhmmss in C language

我需要将此日期:2019-08-22 16:16:08 转换为此特定形式:aammjjhhmmssaa 表示 'année' 或年份;jj 'jour' 或天)。

我正在使用 C 语言。这是我的代码。我觉得不好,因为我需要调用函数三次才能得到我想要的:

#include <stdio.h>
#include <string.h>

void removeChar(char *s, int c){ 

    int j;
    int n = strlen(s); 
    for (int i=j=0; i<n; i++) 
       if (s[i] != c) 
          s[j++] = s[i]; 

    s[j] = '[=11=]'; 
} 

int main() 
{ 
   char s[] = "2019-08-22 16:16:08"; 
   removeChar(s, '-'); 
   printf("test 1 without '-' %s \n",s); 
   removeChar(s, ':');
   printf("test 2 without ':' %s \n",s); 
   removeChar(s, ' ');
   printf("test 3 without ' ' %s \n",s); 
   return 0; 
} 

结果:

test 1 without '-' 20190822 16:16:08                                                                                                        
test 2 without ':' 20190822 161608                                                                                                          
test 3 without ' ' 20190822161608

格式为:YYMMDDHHMMSS.

您可以将其视为 date/time 操作练习(困难),或字符串操作练习(更简单)。

如果你想做date/time操作,那么在POSIX环境下,strptime() and strftime()就是你的朋友。 (注意:strftime() 是标准 C;strptime() 是 POSIX 的一部分。)

您的代码将其视为字符串操作练习。 您的结果显示 YYYYMMDD(年份的 4 位数字);您的请求显示年份的 AA 或 YY(2 位数字)。我想知道哪个是正确的?如果你有 4 个输入和 4 个输出数字,生活会比你有 4 个输入和 2 个输出更简单。假设应该是4位入,4位出,那么你只需要复制这些位即可。

您的代码中有一个细微的错误:

int j;
int n = strlen(s); 
for (int i=j=0; i<n; i++) 
   if (s[i] != c) 
      s[j++] = s[i]; 

s[j] = '[=10=]'; 

您有两个不同的变量 j,最后一个赋值中使用的 j 未初始化。如果您使用 GCC,您可以使用 -Wshadow 作为编译选项来获取有关此类变量阴影的警告。你应该使用:

int j = 0;
int n = strlen(s); 
for (int i = 0; i < n; i++) 
{
   if (s[i] != c) 
      s[j++] = s[i];
}
s[j] = '[=11=]'; 

但是,您理所当然地担心会调用您的函数三次。您可以编写一个只需要调用一次的变体,因为它只保留输入中的数字:

#include <ctype.h>

void keepDigits(char *s)
{
    int j = 0;
    int n = strlen(s);
    for (int i = 0; i < n; i++)
    {
        if (isdigit((unsigned char)s[i]))
            s[j++] = s[i];
    }
    s[j] = '[=12=]';
}

事实上,您也可以避免使用 strlen() 预扫描字符串:

void keepDigits(char *s)
{
    int j = 0;
    for (int i = 0; s[i] != '[=13=]'; i++)
    {
        if (isdigit((unsigned char)s[i]))
            s[j++] = s[i];
    }
    s[j] = '[=13=]';
}

现在您扫描字符串一次而不是 6 次(3 次调用扫描整个字符串的 'remove' 函数,并且每次调用 strlen() 也扫描整个字符串)。

测试代码:

int main(void) 
{ 
   char s[] = "2019-08-22 16:16:08"; 
   printf("Before: [%s]\n", s);
   keepDigits(s); 
   printf("After:  [%s]\n", s);
   return 0; 
}

输出:

Before: [2019-08-22 16:16:08]
After:  [20190822161608]

如果你只想要 2 位数字的年份,那么你可以使用:

int main(void) 
{ 
   char s[] = "2019-08-22 16:16:08"; 
   char *p = &s[2];
   printf("Before: [%s]\n", p);
   keepDigits(p); 
   printf("After:  [%s]\n", p);
   return 0; 
}

输出:

Before: [19-08-22 16:16:08]
After:  [190822161608]

但是请注意,前两位数字仍然在s这里。