UTC时间戳与北京时间转换

news2024/9/25 17:17:59

文章目录

  • 前言
  • 一、几个时间相关的概念
  • 二、场景
  • 三、验证方法
  • 四、源码
  • 五、运行结果
  • 六、资源自取


前言

在应用中用到了 UTC 时间戳与北京时间进行转换的需求,这里做一个记录,方便后面有需求时直接拿来用。


一、几个时间相关的概念

  • GMT 时间:Greenwich Mean Time,格林尼治平时,又称格林尼治平均时间或格林尼治标准时间。是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间。
    • GMT存在较大误差,因此现在已不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)
  • UTC 时间:Universal Time Coordinated,中文名称:世界标准时间或世界协调时。
    • UTC时间可以理解为全世界都公用的一个时间。它实际上反映了一种约定,即为全世界所认可的一个统一时间,而不是某特定地区的时间。
    • 中国人常用的北京时间比 UTC 时间快8个小时。也即 UTC 时间凌晨 0 点时,北京时间已经是早上 8 点,这就是为啥全世界人往往不直接用 UTC 时间计时原因。
  • CST 时间:China Standard Time,即中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。
  • UNIX 时间戳(timestamp):计算机中的 UNIX 时间戳,是以 GMT/UTC 时间 1970-01-01 00:00:00 为起点,到当前具体时间的秒数(不考虑闰秒)。这样做的目的,主要是通过“整数计算”来简化计算机对时间操作的复杂度。

二、场景

要求实现 UTC 时间戳和北京时间的互相转换,其中月份取值范围为 0~11 代表 1~12月。其他时间参数正常(年、日、时、分、秒)

三、验证方法

可以使用 时间戳转换在线工具 来验证转换后的时间是否正确。
在这里插入图片描述
这里以 2023-10-30 18:42:00 这个时间为例,转换后的 UTC 秒数为 1698662520。

四、源码

#include <stdio.h>

typedef struct {
    int year;   // 年份
    int month;  // 月份范围:0-11代表1-12月
    int day;    // 日
    int hour;   // 小时
    int minute; // 分钟
    int second; // 秒
} DateTime;

int IsLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int DaysInMonth(int year, int month) {
    int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 1 && IsLeapYear(year))
        return 29;
    else
        return days[month];
}

int UTCSecondsToBeijing(DateTime* dt, int seconds) {
    int offset = 8 * 3600; // 北京为东八区,相对于UTC的偏移量为8小时
    int totalSeconds = seconds + offset;

    dt->year = 1970;
    dt->month = 0;
    dt->day = 1;
    dt->hour = 0;
    dt->minute = 0;
    dt->second = 0;

    while (totalSeconds >= 86400) {
        int daysInYear = IsLeapYear(dt->year) ? 366 : 365;
        if (totalSeconds >= daysInYear * 86400) {
            totalSeconds -= daysInYear * 86400;
            dt->year++;
        }
        else {
            int month = 0;
            while (totalSeconds >= DaysInMonth(dt->year, month) * 86400) {
                totalSeconds -= DaysInMonth(dt->year, month) * 86400;
                month++;
            }
            dt->month = month;
            dt->day = totalSeconds / 86400 + 1;
            totalSeconds %= 86400;
            dt->hour = totalSeconds / 3600;
            dt->minute = (totalSeconds % 3600) / 60;
            dt->second = totalSeconds % 60;
            break;
        }
    }

    return totalSeconds;
}

int BeijingTimeToUTCSeconds(const DateTime* dt) {
    int totalSeconds = 0;

    for (int year = 1970; year < dt->year; year++) {
        totalSeconds += IsLeapYear(year) ? 366 * 86400 : 365 * 86400;
    }

    for (int month = 0; month < dt->month; month++) {
        totalSeconds += DaysInMonth(dt->year, month) * 86400;
    }

    totalSeconds += (dt->day - 1) * 86400;
    totalSeconds += dt->hour * 3600;
    totalSeconds += dt->minute * 60;
    totalSeconds += dt->second;

    int offset = 8 * 3600; // 北京为东八区,相对于UTC的偏移量为8小时
    totalSeconds -= offset;

    return totalSeconds;
}

int main() {
    // 示例:UTC秒数转换成北京时间
    int utcSeconds = 1698662520; // 假设给定的UTC秒数
    DateTime beijingTime;

    int remainingSeconds = UTCSecondsToBeijing(&beijingTime, utcSeconds);

    printf("UTC Seconds: %d\n", utcSeconds);
    printf("Beijing Time: %04d-%02d-%02d %02d:%02d:%02d\n",
        beijingTime.year, beijingTime.month + 1, beijingTime.day,
        beijingTime.hour, beijingTime.minute, beijingTime.second);
    printf("Remaining Seconds: %d\n\n", remainingSeconds);

    // 示例:北京时间转换成UTC秒数
    DateTime inputTime;
    inputTime.year = 2023;
    inputTime.month = 12 - 1; // 月份范围:0-11代表1-12月
    inputTime.day = 30;
    inputTime.hour = 18;
    inputTime.minute = 42;
    inputTime.second = 0;

    int utcSecondsResult = BeijingTimeToUTCSeconds(&inputTime);

    printf("Beijing Time: %04d-%02d-%02d %02d:%02d:%02d\n",
        inputTime.year, inputTime.month + 1, inputTime.day,
        inputTime.hour, inputTime.minute, inputTime.second);
    printf("UTC Seconds: %d\n", utcSecondsResult);

    return 0;
}

上述代码分为两个部分,一个是将 UTC 秒数转换为北京时间,另一个是将北京时间转换为 UTC 秒数。你可以根据需要使用其中的任一部分。示例中的北京时间转换成 UTC 秒数部分使用的北京时间为 2023年10月30日18时42分,

五、运行结果

在这里插入图片描述
从结果可以看到将 UTC 秒数转换成北京时间,以及从北京时间转换成 UTC 秒数无误。

六、资源自取

UTC时间戳与北京时间转换


我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1151773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分布式·大数据】大模型赛道如何实现华丽的弯道超车 —— AI/ML训练赋能解决方案

文章目录 大模型赛道如何实现华丽的弯道超车 —— AI/ML训练赋能解决方案01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率&#xff0c;降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署01 通过数据抽象化统一数据孤岛02 …

数据库扩展语句,约束方式

扩展语句 create table if not exists ky32 &#xff08;&#xff09;&#xff1a;如果表存在就不创建了 zerofill 自动补齐&#xff08;在命令行可以查看&#xff09; primary key 设置成主键 auto_increment 表示这一列可以自增&#xff0c;默认从1开始&#xff0c;每条记录…

springboot和flask整合nacos,使用openfeign实现服务调用,使用gateway实现网关的搭建(附带jwt续约的实现)

环境准备&#xff1a; 插件版本jdk21springboot 3.0.11 springcloud 2022.0.4 springcloudalibaba 2022.0.0.0 nacos2.2.3&#xff08;稳定版&#xff09;python3.8 nacos部署&#xff08;docker&#xff09; 先创建目录&#xff0c;分别创建config&#xff0c;logs&#xf…

轻松理解 Transformers(2):Attention部分

编者按&#xff1a;随着人工智能技术的不断发展&#xff0c;Transformers 模型架构已成为自然语言处理领域的重要基石。然而&#xff0c;许多人对其内部工作机制仍然感到困惑。本文通过浅显易懂的语言和生活中的例子&#xff0c;帮助读者逐步理解 Transformers 中最核心的 Atte…

加速度中标云尖信息「电子元器件商城」开发项目——加速度jsudo

深圳市加速度软件开发有限公司在电子元器件和工业品行业有着多年得商城开发经验&#xff0c;服务过半导体、元器件、工业品行业的多家上市公司或实力工厂。选择加速度合作的60%的客户&#xff0c;或多或少都有踩坑的经历&#xff0c;这一次他们在选择商城开发商的时候格外谨慎&…

绝味食品营收失速,“卤味鸭脖”还卖得动吗?

随着三季报的密集披露期到来&#xff0c;多家消费领域休闲食品行业上市公司三季报报喜&#xff0c;在消费端呈现欣欣向荣的景象。 甘源食品&#xff1a;2023年前三季度营收13.14亿元&#xff0c;同比增长35.56%&#xff0c;净利润2.14亿元&#xff0c;同比增长139%&#xff0c…

delphi 11.3 FastReport 多设备跨平台 打印之解决方法

以下能WINDOWS10 DELPHI 11.3 FastReport6.0上顺利通过 FastReport6.2对Multi-Device Application应用的支持不够友好&#xff0c;如下图&#xff1b;在palette FastReport6.0才出现几个制件。 非Multi-Device Application应用时是一大堆&#xff1b; 非Multi-Device Appl…

(CESM)地球系统模式

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

腾讯云轻量应用服务器的“镜像”操作系统选择方法

腾讯云轻量应用服务器镜像怎么选择&#xff1f;如果是用来搭建网站可以选择宝塔Linux面板腾讯云专享版&#xff0c;镜像系统根据实际使用来选择&#xff0c;腾讯云百科txybk.com来详细说下腾讯云轻量应用服务器镜像的选择方法&#xff1a; 腾讯云轻量应用服务器镜像选择 轻量…

Spring源码-refresh(1)

1、Refresh方法简介 refresh 是Spring的核心流程&#xff0c;主要包含13个方法。这13个方法中主要又包含3个方法。 如图&#xff1a; 其中标记星号的代表主要的方法。从方法中后面的分支数据也可以看出&#xff0c;主要的方法中存在大量的逻辑处理&#xff0c;后面我们会慢慢分…

Android出现app右上角打了小叉叉

解决方法 找到项目文件夹--------找到.idea文件然后删除--------再次从新打开

黄金期货与黄金现货的区别

黄金期货与黄金现货是有区别的&#xff0c;比如在交易机制方面&#xff0c;黄金期货有具体的交割日&#xff0c;合约到期就必须交割&#xff0c;否则会被强行平仓或以实物进行交割&#xff0c;而在保证金不足时也会被强行平仓&#xff1b;而现货黄金就没有交割限制&#xff0c;…

于璠访谈录 | AI 框架应该和而不同?

点击以下链接收听本期 “大咖访谈” 播客&#xff0c;与大咖面对面&#xff1a; 大咖访谈链接&#xff1a;于璠 | AI 框架应该和而不同&#xff1f; 刘天栋&#xff1a;访谈主持&#xff0c;开源雨林社区顾问、开源社联合创始人、ASF member 于璠&#xff1a;访谈嘉宾&#xf…

Redis——哨兵模式与Zookeeper选举的异同点

摘要 当我们使用主从复制出现的问题&#xff1a;手动故障转移&#xff1a;写能力和存储能力受限&#xff1a;主从复制 -master 宕机故障处理。 主从切换技术的方法是&#xff1a;当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干…

1.qt引入华为鸿蒙字体库

目录 背景下载鸿蒙字体库资源引入使用字体库 背景 因为一些字体是要收费的&#xff0c; 如果使用了&#xff0c;并且商业用途&#xff0c;那么属于侵权行为&#xff0c;那么在此时我们就想要用一些可商用免费开源的字体库&#xff0c;目前华为鸿蒙字体提供了我们一个解决方案&…

MySQL安装后,同局域网其他电脑无法连接问题

MySQL安装后&#xff0c;同局域网其他电脑无法连接问题 1、问题&#xff1a; 在同一个局域网下&#xff0c;笔者电脑安装了MySQL数据库后&#xff0c;出现了其他伙伴想连接笔者电脑的MySQL&#xff0c;而连不上的问题。 2、解决方案 在防火墙中添加开放端口&#xff1a; 第…

MySQL操作命令整理

MySQL操作命令整理 SQL分类 SQL语句按照其功能范围不同可分为3个类别: 数据定义语言(DDL ,Data Defintion Language)语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等。常用的语句关键字包括create、drop、alter等。数据操作语言(DML , Data Manipulatio…

如何将R128的lspsram频率提高至200M?

一、修改频率方法 首先通过cboot0命令&#xff0c;跳转到boot0的代码中&#xff0c;路径为&#xff1a; ${root_dir}/lichee/brandy-2.0/spl/ 找到lspsram的代码&#xff0c;路径为&#xff1a; ${root_dir}/lichee/brandy-2.0/spl/drivers/psram 修改头文件&#xff0c;将2…

有奖招募!清华社招募2023年度“荐书官”啦

清华社招募2023年度“荐书官”啦&#xff01;分享你读过的清华社IT领域好书&#xff0c;就有机会成为“荐书官”&#xff0c;并获得丰厚好礼&#xff01; 在IT领域&#xff0c;读书破万卷&#xff0c;bug全不见&#xff01;案头必备一本书&#xff0c;需求来了我不哭&#xff…

记一次红队打的逻辑漏洞(验证码绕过任意用户密码重置)

八月初参加某市演练时遇到一个典型的逻辑漏洞&#xff0c;可以绕过验证码并且重置任意用户的密码。 首先访问页面&#xff0c;用户名处输入账号会回显用户名称&#xff0c;输入admin会回显系统管理员。&#xff08;hvv的时候蓝队响应太快了&#xff0c;刚把admin的权限拿到了&a…