在 C 中操纵时间(时区之间)的一般方法?

2024-01-07

在为以下问题编写示例代码后时区之间转换 https://stackoverflow.com/questions/1173578/converting-between-timezones-in-c,其中一条评论是需要更通用的方法来从时区 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);
}

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

我被宠坏了,因为R http://www.r-project.org这些事情做得很好:

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 是当前版本)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 中操纵时间(时区之间)的一般方法? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐