举世无双勇 2022-08-16 19:21 采纳率: 71.4%
浏览 1997
已结题

时间格式1:2022-08-16T19:07:11+08:00如何转换成.000Z结尾的时间格式2 如:2022-08-16T19:07:11.000Z可以的话请介绍下时间转换的原理

问题遇到的现象和发生背景

时间格式1:2022-08-16T19:07:11+08:00
如何转换成.000Z结尾的时间格式2 如:2022-08-16T19:07:11.000Z
可以的话请介绍下时间转换的原理,使用C++

  • 写回答

2条回答 默认 最新

  • 爱看书的小沐 2022-08-17 22:40
    关注

    问题解析如下:
    (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时间,世界标准时间
    举例220100607T152000Z,表示2010年6月715200秒,Z表示是UTC时间
    举例320100607T152000+08,其中 “+08” 表示东八区。表示北京时间。
    

    (2 )UTC时间的表示
    日期和时间通过大写字母 T 来分隔。
    UTC 时间通过大写字母 Z 来定义。最末尾的Z表示UTC统一时间。
    如果您希望修改相对于 UTC 的时间,请删除 Z 并用 +HH:MM 或 -HH:MM 代替:

    • javascript代码如下:
      var d = new Date("2018-02-19T12:00:00");
      var d = new Date("2018-02-19T12:00:00-08:30");
      
    • java代码如下:
      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月2715430秒,因为我的电脑默认时区为东8区,则0时区的时间为2015年2月277430秒,则UNIX时间戳为1425022980秒。
    

    img

    img

    (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);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月26日
  • 已采纳回答 8月18日
  • 创建了问题 8月16日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分