问题描述
我希望使用以下格式的时间:“ t”:“ 2020-03-06T12:09:38.000Z” 。如何在C中做到这一点?
源代码:
// Get time From NTP and setup in SDK format
String GetTime(){ // Setup UCT time from NTP server
String Y,M,D1,D2,Ti;
time_t Now = time(nullptr);
String T= (ctime(&Now));
//Serial.println(T);
if (T.substring(20,22) == "20") {
D1 = T.substring(8,9); if (D1 == " ")D1 = "0";
D2 = T.substring(9,10);
M = Months(T.substring(4,7)); Y = T.substring(20,24);
Ti = T.substring(11,19);
return (Y+"-"+M+"-"+D1+D2+"T"+Ti+".000Z");
}
return (Y+"-"+M+"-"+D1+D2+"T"+Ti+".000Z");
}
谢谢
解决方法
在C语言中,您可以使用 strftime ,但是您的代码不是C代码。
/* strftime example */
#include <stdio.h> /* puts */
#include <time.h> /* time_t,struct tm,time,localtime,strftime */
int main ()
{
time_t rawtime;
struct tm * timeinfo;
char buffer [80];
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80,"%Y-%m-%dT%H:%M:%S.000Z",timeinfo);
puts (buffer);
return 0;
}
来源:http://www.cplusplus.com/reference/ctime/strftime/
,如何在C中从NTP服务器设置UTC时间
我尝试使用下面的代码从NTP获取时间,但是它对我不起作用。
OP的发布代码在本地时间形成字符串,而不是UTC,因为ctime()
就像asctime(localtime(timer))
。
代码应将gmtime(const time_t *timer);
用于UTC。
存在字符串管理问题。在C语言中,最好提供缓冲区。
要形成像时间戳一样的ISO 8601,请使用strftime()
。
-
%F
等效于“%Y-%m-%d”(ISO 8601日期格式)。 [tm_year,tm_mon,tm_mday] -
%T
等效于“%H:%M:%S”(ISO 8601时间格式)。 [tm_hour,tm_min,tm_sec]
要访问亚秒级单位,需要特定于实现的代码。下面的示例代码使用".000"
。
一些用于启动OP的示例代码。
#include <stdio.h>
#include <time.h>
char* ISO8601(size_t sz,char dest[sz],time_t t) {
struct tm *tm = gmtime(&t);
if (tm == NULL) {
return NULL;
}
if (strftime(dest,sz,"%FT%T.000Z",tm) == 0) {
return NULL;
}
return dest;
}
int main(void) {
char buf[100];
char *s = ISO8601(sizeof buf,buf,time(NULL));
if (s) {
puts(s);
}
}
输出
2020-08-25T08:19:42.000Z