c - 如何在 C 中获得不同时区的 Epoch 日期和时间?

标签 c linux

这是我用 C 编写的代码,我试图在其中获取当前纪元的日期和时间。不过,好像不对?我在这里的逻辑中缺少什么? 这是遗留代码,我不确定为什么我们需要调整偏移量。

#include <stdio.h>
#include <time.h>

#define SECS_IN_DAY (60 * 60 * 24)
static void GetEpochs()
{
    const int SECS_IN_MINUTE = 60;
    const int MIN_IN_HOUR = 60;
    const int SECS_IN_HOUR = SECS_IN_MINUTE * MIN_IN_HOUR;


    int offset; /* difference (+/-) between local and UTC time in seconds */
    time_t currentTime = time(NULL); /* current time in seconds */
    time_t adjustedTime; /* current time adjusted for timezone */

    struct tm* locTime = localtime(&currentTime);
    int localHour = locTime->tm_hour;
    int localMin = locTime->tm_min;

    struct tm* gmTime = gmtime(&currentTime);
    int gmHour = gmTime->tm_hour;
    int gmMin = gmTime->tm_min;

    /* create difference between local and gm time in (+/-) seconds */
    offset = ((localHour * SECS_IN_HOUR) + (localMin * SECS_IN_MINUTE)) - ((gmHour * SECS_IN_HOUR) + (gmMin * SECS_IN_MINUTE));

    /* adjust for wrapping over/under a day */


    if (offset > SECS_IN_DAY/2)
        offset = offset - SECS_IN_DAY;
    else if (offset < -(SECS_IN_DAY/2))
        offset = offset + SECS_IN_DAY;

    /* Create the adjusted time */ 
    adjustedTime = currentTime + offset;


    printf("Epoch Hour = %ld\r\n",adjustedTime/((15 * 60)));

    printf("Epoch Day = %ld\r\n",adjustedTime/(((60 * 60 * 24))));
}

void main()
{
  GetEpochs();

}

最佳答案

用于 time.h header 中定义的各种函数的时区由 TZ 环境变量确定。

在不触及 TZ 环境的情况下使用 localtime() 函数,默认情况下将使用您操作系统的时区。更准确地说,它将使用您从 UNIX 系统上的系统时区目录(即 /usr/share/zoneinfo矿)。我个人不知道其他操作系统的功能。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
    // print date and time in your local timezone
    struct tm* t1 = localtime( &(time_t){time(NULL)} );
    printf("%s", asctime(t1));

    // print date and time in UTC
    setenv("TZ", "UTC", 1);
    struct tm* t2 = localtime( &(time_t){time(NULL)} );
    printf("%s", asctime(t2));

    // print date and time reading from the timezone file
    setenv("TZ", ":Europe/London", 1);
    struct tm* t3 = localtime( &(time_t){time(NULL)} );
    printf("%s", asctime(t3));

    return 0;
}

上述程序的输出将如下所示:

Tue May  8 09:49:42 2018
Tue May  8 07:49:42 2018
Tue May  8 08:49:42 2018

我在第三个例子中谈到的文件是相对于系统时区目录的,在本例中为/usr/share/zoneinfo/Europe/London

您可以在 tzset() manpage 中阅读有关 TZ env 以及调整它的方法的更多信息.

关于c - 如何在 C 中获得不同时区的 Epoch 日期和时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50227212/

相关文章:

Codeblocks GTK 项目未找到 gtk.h 并且此路径不包含 include 或 lib 文件夹

java - 使用 java 程序在 linux 终端中运行命令?

linux - glib-networking 找不到 gio/gio.h

c - 将特定库与 gcc 链接

c - 尝试打印数组的第一个值时出现段错误

c - 一遍又一遍地在String中使用struct(C语言)

linux - 如何使用sed将字符串替换为数字?

c - 为什么 sizeof (void(*)(void)) 打印 8?

linux - 为什么 64 位 Linux 进程的 VSIZE 大这么多?

linux - 在 AWK 中 `rec=rec","$i` 没有按预期工作,其中 $i 是记录中的每个字段