问题遇到的现象和发生背景
时间格式1:2022-08-16T19:07:11+08:00
如何转换成.000Z结尾的时间格式2 如:2022-08-16T19:07:11.000Z
可以的话请介绍下时间转换的原理,使用C++
时间格式1:2022-08-16T19:07:11+08:00
如何转换成.000Z结尾的时间格式2 如:2022-08-16T19:07:11.000Z
可以的话请介绍下时间转换的原理,使用C++
问题解析如下:
(1)UTC时间的定义
UTC(Universal Time Coordinated)基本等同于 GMT(格林威治时间)。
注释:UTC,协调世界时,又称世界统一时间,世界标准时间,国际协调时间。在日期-时间字符串中省略 T 或 Z,在不同浏览器中会产生不同结果。
根据 ISO 8601《数据存储和交换形式·信息交换·日期和时间的表示方法》,UTC时间,也就是国际统一时间/国际协调时,表示方法如下:
YYYYMMDD T HHMMSS Z(或者时区标识)。
举例1:2016-08-9T10:01:54.123Z,表示UTC时间,世界标准时间
举例2:20100607T152000Z,表示2010年6月7号15点20分0秒,Z表示是UTC时间
举例3:20100607T152000+08,其中 “+08” 表示东八区。表示北京时间。
(2 )UTC时间的表示
日期和时间通过大写字母 T 来分隔。
UTC 时间通过大写字母 Z 来定义。最末尾的Z表示UTC统一时间。
如果您希望修改相对于 UTC 的时间,请删除 Z 并用 +HH:MM 或 -HH:MM 代替:
var d = new Date("2018-02-19T12:00:00");
var d = new Date("2018-02-19T12:00:00-08:30");
String date = "2021-01-30T16:00:00.000Z";
date = date.replace("Z", " UTC");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
Date d = format.parse(date);
(3)北京时间
T表示分隔符,Z表示的是UTC.
UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
按北京时间来算,北京时间将比UTC时间快8个小时。
北京时间:2021-01-31 00:00:00对应的国际标准时间格式为:2021-01-30T16:00:00.000Z
(4)时间戳
计算机中的UNIX时间戳,是以GMT/UTC时间「1970-01-01T00:00:00」为起点,到具体时间的秒数,不考虑闰秒。这么做当然是为了简化计算机对时间操作的复杂度。
比如我的电脑现在的系统时间为2015年2月27日15点43分0秒,因为我的电脑默认时区为东8区,则0时区的时间为2015年2月27日7点43分0秒,则UNIX时间戳为1425022980秒。
(5)结论
c++相关实现。在代码实现过程中,可能需要通过代码将T和Z提前处理下,将时间字符串构造成常见的格式:yyyy-MM-dd HH:mm:ss.SSS,再通过c++函数接口进一步调用处理。
第一步:
我们回到最开始问题本身:
时间格式1:2022-08-16T19:07:11+08:00,对应的是北京时间2022-08-06 19:07:11
时间格式2:2022-08-16T19:07:11.000Z,对应的是标准时间2022-08-06 19:07:11
第二步:
将T和Z处理除掉,然后将字符串转为常见标准格式:2022-08-06 19:07:11或2022-08-06 19:07:11.000(其中.000是毫秒值)
第三步:
根据自己的需求,转为其他的格式,比如添加T或Z等。
时间转字符串:
#include <stdio.h>
#include <time.h>
#include <string>
using namespace std;
int main ()
{
time_t rawtime;
struct tm * timeinfo;
char buffer [80];
time (&rawtime);
timeinfo = localtime (&rawtime);
int length= strftime (buffer,80,"%Y-%m-%dT%H:%M:%SZ\n",timeinfo);
printf ("timestamp: %.*s",length,buffer);
return 0;
}
字符串转时间:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
using namespace std;
int main(void)
{
struct tm *timeinfo;
char buffer[80];
memset( timeinfo, 0, sizeof(struct tm));
strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", timeinfo);
int length= strftime (buffer,80,"%Y-%m-%dT%H:%M:%SZ\n",timeinfo);
printf ("timestamp: %.*s",length,buffer);
exit(EXIT_SUCCESS);
}