UTC时间戳与北京时间转换

文章目录

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


前言

在应用中用到了 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;elsereturn 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.mzph.cn/news/124486.shtml

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

相关文章

SpringBoot内置工具类之断言Assert的使用与部分解析

2023.10.29更新&#xff1a; 使用assert的不利之处&#xff1a; 1、assert关键字需要在运行时候显式开启才能生效&#xff0c;否则你的断言就没有任何意义。而现在主流的Java IDE工具默认都没有开启-ea断言检查功能。这就意味着你如果使用IDE工具编码&#xff0c;调试运行时候…

深度学习简史

一、说明 为了学习好深度学习&#xff0c;有必要知道深度学习的整个成长历史&#xff0c;可以说&#xff0c;深度学习的发展历程伴随整个人工智能的成长历程&#xff0c;本文将介绍这个历程的关键性历史节点。 二、深度学习的旅程 2.1 深度学习的当前认知 深度学习是机器学习的…

MacOS将Node.js升级到最新版本

Upgrade Node.js to the latest version on Mac OS 在Mac O S上将Node.js升级到最新版本 文章目录 Upgrade Node.js to the latest version on Mac OS1. brew2. n3. nvm4. package 1. brew If you initially installed Node.js with Homebrew, run: 如果您最初使用 Homebrew …

ASP.NET WebApi 极简依赖注入

文章目录 环境服务类启动项注入使用依赖注入的优点 环境 .NET Core 7.0ASP.NET CoreVisual Studio 2022 服务类 public class T_TempService {public T_TempService(){}public void Test(){}}启动项注入 #region 依赖注入 builder.Services.AddTransient<T_TempService&g…

滑动窗口限流算法实现一

固定算法 原理&#xff1a;固定算法是将时间线分隔成固定大小的时间窗口&#xff0c;每个窗口都会有个计数器&#xff0c;用来记录窗口时间范围内的请求总数&#xff0c;如果窗口的请求总数达到最大限定值&#xff0c;会认定流量超限。比如将窗口大小设为1分钟&#xff0c;每分…

科大讯飞勾勒生成式AI输入法“模样”,开启下一代输入法革命

回顾国内第三方输入法赛道近十余年的发展&#xff0c;移动互联网的市场红利催生了科大讯飞、百度、搜狗等颇具规模和实力的头部厂商。与此同时&#xff0c;历经多年、多方角逐&#xff0c;第三方输入法市场进入存量阶段&#xff0c;升级技术、优化用户体验来挖掘存量&#xff0…

Rest风格基本语法与实战

1&#xff0c;前置知识点 1.1 GetMapping&#xff0c;PostMapping&#xff0c;PutMapping&#xff0c;DeleteMapping 平时我们都是使用RequestMapping&#xff0c;然后通过它的method属性来指定请求的方式&#xff0c;这样是有些麻烦的&#xff0c;然后这四个标签就是来简化这…

MySQL安装『适用于 CentOS 7』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 腾讯云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.MySQL 的清理与安装1.1查看是否存在 MySQL 服务1.2.卸载原有服务1.…

JS逆向基础之反调试

JS逆向基础之反调试 截至目前的话大家应该都知道我们在进行js逆向的时候需要打开浏览器开发者工具进行网页的调试&#xff0c;但是在有时候网站会阻止我们去调试它的代码&#xff0c;而其阻止我们的手段也是多种多样的。接下来我们就来简单了解一下逆向过程中常见的反调试手段…

文件下载漏洞, 漏洞原理, 测试方法, 漏洞防御, 常见敏感路径

文件下载漏洞 一, 文件下载漏洞原理 利用条件: 1. 读取文件的路径是用户可控, 且没有校验或检验不严. 2. 使用了读取文件的函数. 3. 输出了文件内容.漏洞场景一: 后端没有限制哪些路径的文件可以下载 后端代码: http://192.168.112.200/security/download.php $file_pat…

keealived安装配置启动

1.keepalived作用和原理图 keepalived作用:解决单点故障简单原理图1: 2.keepalived安装配置启动 地址: https://www.keepalived.org/download.html# 1)解压 tar -zxvf keepalived-2.0.18.tar.gz # 2)进入keepalived目录 cd keepalived-2.0.18/ # 3)安装libnl/libnl-3依赖…

chat gpt 在开发当中的应用

chatgpt 出来已经有一段时间了&#xff0c;本人在开发的过程中也是有去使用。 经常使用的是讯飞大模型和通义千问&#xff0c;在使用的过程中&#xff0c;个人感觉讯飞大模型在写代码方面会比较智能。 比如问一个 sqlser 单表 数据量 几个亿如何处理的问题&#xff0c;讯飞会给…

C/C++ 飞翔的小鸟

载入问题&#xff1a; 解决之后效果&#xff1a; 放在main函数里面进行封装&#xff1a; 效果展示: 实现下坠 放进while&#xff08;1&#xff09;里面不断进入循环&#xff0c;每次进入循环&#xff0c;鸟的y坐标值就会发生变化&#xff0c;以此实现下下坠效果 效果展示&#…

Vue 数据绑定 和 数据渲染

目录 一、Vue快速入门 1.简介 : 2.MVVM : 3.准备工作 : 二、数据绑定 1.实例 : 2.验证 : 三、数据渲染 1.单向渲染 : 2.双向渲染 : 一、Vue快速入门 1.简介 : (1) Vue[/vju/]&#xff0c;是Vue.js的简称&#xff0c;是一个前端框架&#xff0c;常用于构建前端用户…

Hive客户端和Beeline命令行的基本使用

本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.Hive CLI 1.1 命令帮助Help 使用 `hive -H` 或者 `hive --help` 命令可以查看所有命令的帮助,显示如下: usage: hive-d,--define <key=value> Variable subsitution to ap…

C#学习相关系列之多线程---TaskCompletionSource用法(八)

一、TaskCompletionSource类的作用 TaskCompletionSource类回调代码转换为可以等待的Task&#xff0c;TaskCompletionSource本身不是可等待的&#xff0c;它也不是有效的异步方法返回类型。一旦TaskCompletionSource给了你一个任务&#xff0c;你可以简单地返回那个任务&#x…

2023NOIP A层联测20-点餐

一家新的餐馆开业了&#xff0c;为了吸引更多的顾客&#xff0c;每样餐品都有打折的活动。特别的&#xff0c;餐馆内一共有&#x1d45b;样菜品&#xff0c;编号从 1 1 1 到 n n n&#xff0c;每样菜品每人最多只能点一次。对于第 i i i 种菜品&#xff0c;其包含两种价格&a…

Flutter FittedBox

&#x1f525; 英文单词FittedBox &#x1f525; Fitted 通过有道翻译如下 &#xff1a; Box 通过有道翻译如下 &#xff1a; 对 FittedBox 的理解 我们可以将 FittedBox 理解为合适的盒子&#xff0c;将其它布局放到FittedBox这样一个盒子中&#xff0c;从而实现 盒子里面的…

kubernetes实验挑战二(troubleshoot pv pvc )

This 2-Node Kubernetes cluster is broken! Troubleshoot, fix the cluster issues and then deploy the objects according to the given architecture diagram to unlock our Image Gallery!! 1、 kubeconfig /root/.kube/config, User ‘kubernetes-admin’ Cluster: S…

SpringCloud(一) 服务架构的演变及注册RestTemplate实现服务的远程调用

目录 一, 服务架构的演变 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 二, 服务拆分和远程调用 2,1 服务拆分原则 2.2 服务拆分示例 2.3 创建相应数据库 2.4 实现远程调用示例 1, 更改需求 2, 注册RestTemplate实现远程调用 2.5 服务消费者和提供者 一…