我有一个日期和时间作为花车。
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"
我已经读过strftime
和strptime
这样的功能可以解析这些数字并正确输出它们,但为此我想我需要一些特定于拱形的标题?
达到我需要的建议方法是什么?理想情况下,无处不在。
非常感谢任何帮助或进一步的参考。
答案 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