UTC时间戳与北京时间转换

这篇具有很好参考价值的文章主要介绍了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 为起点,到当前具体时间的秒数(不考虑闰秒)。这样做的目的,主要是通过“整数计算”来简化计算机对时间操作的复杂度。

二、场景

1、场景 1

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

2、场景 2

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

三、验证方法

可以使用 时间戳转换在线工具 来验证转换后的时间是否正确。
UTC时间戳与北京时间转换,代码随记,c语言,UTC
这里以 2023-10-30 18:42:00 这个时间为例,转换后的 UTC 秒数为 1698662520。

四、源码

1、场景 1

其中月份取值范围为 0~11 代表 1~12月

#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分,

2、场景 2

时间日期均为正常

#include <stdio.h>

typedef struct {
    int year;   // 年份
    int month;  // 月
    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 == 2 && IsLeapYear(year))
        return 29;
    else
        return days[month - 1];
}

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

    dt->year = 1970;
    dt->month = 1;
    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 = 1;
            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 = 1; 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 = 1677566700; // 假设给定的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, beijingTime.day,
        beijingTime.hour, beijingTime.minute, beijingTime.second);
    printf("Remaining Seconds: %d\n\n", remainingSeconds);

    // 示例:北京时间转换成UTC秒数
    DateTime inputTime;
    inputTime.year = 2023;
    inputTime.month = 2;
    inputTime.day = 28;
    inputTime.hour = 14;
    inputTime.minute = 45;
    inputTime.second = 0;

    int utcSecondsResult = BeijingTimeToUTCSeconds(&inputTime);

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

    return 0;
}

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

五、运行结果

1、场景 1

UTC时间戳与北京时间转换,代码随记,c语言,UTC
从结果可以看到将 UTC 秒数转换成北京时间,以及从北京时间转换成 UTC 秒数无误。

2、场景 2

UTC时间戳与北京时间转换,代码随记,c语言,UTC
从结果可以看到将 UTC 秒数转换成北京时间,以及从北京时间转换成 UTC 秒数无误。

六、资源自取

UTC时间戳与北京时间转换
UTC时间戳与北京时间转换,代码随记,c语言,UTC


我的qq:2442391036,欢迎交流!文章来源地址https://www.toymoban.com/news/detail-722336.html


到了这里,关于UTC时间戳与北京时间转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hive中时间戳与时间字符串相互转换的方法教程

    时间戳是数据库常用的存放日期的形式之一,表示从 UTC 时间’1970-01-01 00:00:00’开始到现在的秒数,与常规时间格式如 ‘2018-01-01 00:00:00’可以相互转换,方法如下。 一、unix_timestamp 函数用法 1、unix_timestamp() 返回当前时间戳。另外,current_timestamp() 也有同样作用。 2、unix_ti

    2024年02月13日
    浏览(40)
  • Unix、UTC、GPS时间戳及转换

    UTC时间 UTC时间的英文全称:Universal Time Coordinated,中文名称:协调世界时。俗的理解为,这个时间是全世界通用的,即全世界都公用的一个时间。可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。 起始时间为:1970年1月1日 北京时

    2024年02月07日
    浏览(25)
  • 【Vue】使用moent转换GMT时间格式为北京时间

    名词解释 GMT(Greenwich Mean Time)和UTC(Coordinated Universal Time)是两个时间标准,它们在许多方面非常相似,但也有一些微小的差异。 GMT最初是在1884年确定的,它是以英国伦敦的格林威治天文台的时间为基准。GMT使用了一个固定的时区偏移,没有考虑夏令时的变化。因此,在夏

    2024年02月05日
    浏览(44)
  • Java获取当前的UTC时间

    java中如何获取utc时间,并转为Date对象,这是一个常见的问题。可能会找到如下代码的回答: 但是运行过后发现不能获取带UTC时间 那么为什么不能获取,如何正确获取utc时间呢? 分析一下上述代码为什么不能获取正确的UTC时间 看一下 Calendar.getTime() 方法 本质上是通过 getTi

    2024年02月05日
    浏览(30)
  • 前端将UTC时间格式转化为本地时间格式~~uniapp写法

    首先我们先简单的了解一下:UTC时间(协调世界时,Coordinated Universal Time)使用24小时制,以小时、分钟、秒和毫秒来表示时间 HH 表示小时,取值范围为00到23。 mm 表示分钟,取值范围为00到59。 ss 表示秒,取值范围为00到59。 SSS 表示毫秒,取值范围为000到999。 需要注意的是,

    2024年02月10日
    浏览(28)
  • Linux 操作系统——查看/修改系统时区、时间、本地时间修改为UTC

    最近一个项目日期采用java8的LocalDate 和 LocalDateTime ,在本地windows 下运行,日期没有问题,但是当部署到linux 系统上时,相差8 小时,第一时间想到时linux 服务器日期和时间设置的问题。果断登陆linux 服务器查看。 GMT(Greenwich Mean Time,格林威治标准时间): 是指位于英国伦敦郊区

    2024年02月07日
    浏览(58)
  • HIVE中PST, UTC, PRC(CST)时区转换

    日常开发中经常需要对不同时区的时间或时间戳进行转换。 以下假定我们HIVE所使用的的默认时区是PST时区,思路是不管传入的什么时区都先转成UTC时区 PRC/CST = PST(PDT) + 15h(夏)=UTC/GMT + 8h PRC/CST = PST(PDT) + 16h(冬)=UTC/GMT + 8h 结果:这里拿到的是PST时区的时间

    2024年02月10日
    浏览(40)
  • 解析TZ字样的0时区UTC时间格式化为东八区

    TZ 的 Z 是zero timezone 0时区的意思。带TZ的时间是UTC=0的时间 SimpleDateFormat默认使用系统日历时区,必须手动指定0时区,才能正确解析TZ时间 详细测试代码见下: 参考

    2024年01月19日
    浏览(31)
  • Linux 硬件时间(RTC time)、系统时间(UTC时间、Universal time)、本地时间(Local time)、时区(Time zone)与夏令时(DST)解析

    处理和管理时间是计算机科学的重要方面,但也是最复杂和容易混淆的方面之一。本文将详细介绍硬件时间、系统时间(UTC时间)、本地时间、时区和夏令时,希望能帮助读者更好地理解这些概念。 1.1 硬件时间简介 硬件时间,也被称为实时时钟(RTC),是指计算机主板上的

    2024年02月04日
    浏览(30)
  • 【C语言】时间转换24小时制转12小时制

            首先我们先了解一下24小时制转12小时制需要注意的几个点(时 命名为h)                 1.当h=12且h24的时候,就是下午                 2.当h==24的时候,就是上午(第二天上午)                 3.h12的时候,就是上午         那么根据这个思路,我们就可以写

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包