如何在C中从NTP服务器设置UTC时间

问题描述

我希望使用以下格式的时间:“ t”:“ 2020-03-06T12:09:38.000Z” 。如何在C中做到这一点?

我尝试使用下面的代码从NTP获取时间,但是它对我不起作用。

代码

// 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