文章

GNSS 的周内秒如何转为 UTC 时间?

GNSS 的周内秒如何转为 UTC 时间?

一般情况下, GNSS 的周内秒是来自于原子时的不断累加, 而 UTC 则是天文时间,和地球的自转时间有关,由于地球的自转时间不规则,UTC 时间和原子时之间存在一个误差,截至目前,UTC 时间比原子时慢了 18 秒,所以在使用 GNSS 的周内秒时,常常需要将其转换为 UTC 时间,下面有一个很简单的例子,可以按照这种思维方式来实现转换。

引子

小熊有两块秒表 A,B;A 秒表从 0 数到 59 后又会从 0 开始计时,B 秒表也是如此,但是 B 秒表永远比 A 秒表慢 18 秒,已知 A 秒表的读数,请求出 B 秒表的读数。

问题分析

当 A 的读数为 a 时,B 的读数应为 (a - 18) 秒。如果结果为负数,则需要加上 60 使其回到 0-59 的范围内。

处理思路

使用模运算来处理循环问题。表达式 (a - 18 + 60) % 60 确保无论 a 的大小如何,结果都落在 0 到 59 之间。

代码实现

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main() {
    int a;
    scanf("%d", &a);
    int b = (a - 18 + 60) % 60;
    printf("%d\n", b);
    return 0;
}

周内秒

周内秒的值范围是 [0, 604800) 累计,再从 0 开始循环以往。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main() {
    unsigned int a;
    scanf("%d", &a);
    unsigned int b = (a + 604800 - 18) % 604800;
    printf("%d\n", b);
    printf("H: %d\n", (b / 3600) % 24);
    printf("M: %d\n", (b / 60) % 60);
    printf("S: %d\n", b % 60);
    return 0;
}
本文由作者按照 CC BY 4.0 进行授权