从char数组将日期转换为ISO8601

时间:2016-11-15 22:23:49

标签: c

我有一个日期和时间作为花车。

float thedate = 20161115;
float thetime = 181011.377500;

我想将它们转换为ISO8601日期时间格式,换句话说,将它们写入文件为" 2016-11-15T18:10:11.377500"

我设法通过执行以下操作在char数组中获取这些值:

char datetimestr[64];
snprintf(datetimestr, sizeof(datetimestr), "%8.0f%f", thedate, thetime);
printf(datetimestr);

这打印:" 20161115181011.377500"

我已经读过strftimestrptime这样的功能可以解析这些数字并正确输出它们,但为此我想我需要一些特定于拱形的标题?

达到我需要的建议方法是什么?理想情况下,无处不在。

非常感谢任何帮助或进一步的参考。

4 个答案:

答案 0 :(得分:3)

您需要对输入值使用一些数学来提取其各个组件,例如:

int theyear = thedate / 10000;
int themonth = (thedate - (theyear * 10000)) / 100;
...and so on

然后,您可以使用sprintf()来构建字符串。

答案 1 :(得分:1)

运气不好。精度不够。

典型的float无法代表20161115.0,而是会另存为20161116.0f

考虑其他类型。建议long thedate

键入以下内容以查看thedate

中确实保存的内容
volatile float f = 20161115.0f;
printf("%.10e\n", f);

可疑输出将为2.0161116000e+07

答案 2 :(得分:1)

代码可以打印值,然后再次解析它们

head

输出

int main() {
  long thedate = 20161115;
  float thetime = 181011.377500f;
  char buf[80];
  snprintf(buf, sizeof buf, "%+08ld%+08f", thedate, thetime);
  int y,M,d,h,m;
  float s;
  int n = 0;
  sscanf(buf, "%5d%2d%2d%3d%2d%f%n", &y, &M, &d, &h, &m, &s, &n);
  if (n) {
    // ISO 8601 specifies a sign must exist for distant years.
    printf((y >= 0 && y <= 9999) ? "%4d" : "%+4d" , y);
    printf("-%02d-%02dT%02d:%02d:%02.6f\n", M, d, h, m, s);
  }
  puts(buf);
  return 0;
}

答案 3 :(得分:0)

感谢您的意见和解答。我已经按照建议进行了测试,看起来效果很好(除了毫秒,但这应该很容易修复)

以下是代码:

long thedate = 20161115;
float thetime = 181011.377500;

int y = thedate / 10000;
int m = (thedate - (y * 10000)) / 100;
int d = (thedate - (y * 10000) - (m * 100));

int h = thetime / 10000;
int min = (thetime - (h * 10000)) / 100;
int sec = (thetime - (h * 10000) - (min * 100)) / 1;
float mili = thetime - ((float)h * 10000) - ((float)min * 100) - (float)sec;

printf("%i-%i-%iT%i:%i:%i%.6f\n",y,m,d,h,min,sec,mili);
// Outputs : 2016-11-15T18:10:110.3775000