【问题标题】:General way to manipulate the times (between timezones) in C?在C中操纵时间(时区之间)的一般方法?
【发布时间】:2010-11-16 02:19:54
【问题描述】:

在为converting between timezones 的问题编写了示例代码后,其中一个问题是需要更通用的方法来从时区 A 转换到时区 B。我也很好奇自己有一个更高级的这种操作的原语,所以我写了下面的代码。

我看到的一个缺点是它会不断地摆动环境变量中的 TZ,从而改变“本地时间”的概念。虽然它似乎有效(虽然我没有检查它对 DST 期间的反应,但由于它基于 Olson 数据库,所以应该应该),我很好奇是否有人对如何处理这个有更好的想法任务 ?

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

time_t utc_now() {
  struct timeval tv_utc;
  gettimeofday(&tv_utc, NULL);
  return tv_utc.tv_sec;
}

void use_tz(char *timezone) {
  if(timezone) {
    setenv("TZ", timezone, 1);
  } else {
    unsetenv("TZ");
  }
  tzset();
}

time_t utc_from_local_tm(struct tm *local_tm, char *timezone) {
  time_t utc;
  use_tz(timezone);
  utc = mktime(local_tm);
  return utc;
}

struct tm *local_tm_from_utc(time_t utc, char *timezone) {
  use_tz(timezone);
  return localtime(&utc);
}

int main(int argc, char *argv[]) {
  struct tm *tm;
  struct tm tm2;
  time_t utc, utc2, utc3;
  utc = utc_now();
  tm = local_tm_from_utc(utc, "Europe/Brussels");
  printf("Local time in Brussels now: %s", asctime(tm));
  utc2 = utc_from_local_tm(tm, "Europe/Moscow");
  tm = local_tm_from_utc(utc2, "UTC");
  printf("UTC time if the above was the Moscow local time: %s", asctime(tm));

  memset(&tm2, sizeof(tm2), 0);
  /* 13:00:00 on 11 dec 2010 */
  tm2.tm_sec = tm2.tm_min = 0;
  tm2.tm_hour = 13;
  tm2.tm_mon = 11;
  tm2.tm_mday = 11;
  tm2.tm_year = 110;


  utc3 = utc_from_local_tm(&tm2, "Europe/Brussels");
  printf("Brussels time: %s", asctime(&tm2));
  tm = local_tm_from_utc(utc3, "Europe/Moscow");
  printf("At 13:00:00 on 11 dec 2010 CET the time in Moscow will be: %s", asctime(tm));

  exit(0);
}

【问题讨论】:

    标签: c timezone


    【解决方案1】:

    如果将 TZ 信息存储在环境变量中会让您感到困惑,那么如何创建一个新的结构,其中包含 struct tm 以及用于 TZ 信息的 char* ?

    我被宠坏了,因为R在这些事情上做得很好:

    R> now <- Sys.time()
    R> now
    [1] "2009-08-01 17:19:07 CDT"
    R> format(now, tz="Europe/Brussels")
    [1] "2009-08-02 00:19:07"
    R> 
    

    它对标准 POSIX 函数有一些扩展/替换,请参阅文件 R-2.9.1/src/main/datetime.c(其中 R-2.9.1 是当前版本)

    【讨论】:

    • 啊,有趣。我会看一下 R 来源 - 我听说过 R 但还没有看过它。谢谢! +1 :) 发痒的感觉主要是因为可能会有其他线程 - 所以我天真的代码在多线程环境中可能会出现错误。
    • 终于有时间去看了——太棒了。感谢您的参考,它确实完全回答了问题。
    • 一个代码示例将是很好的贡献。您能否粘贴您的操作方式以节省其他感兴趣的人的时间。我会很高兴的。
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多