在 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 中操纵时间(时区之间)的一般方法? 的相关文章

  • 不同翻译单元中字符串文字的内存地址是否相同?

    假设我们有以下 cpp 文件 include
  • C# SMO 远程数据库备份到本地机器

    我有一个执行 SQL 数据库备份和恢复的应用程序 这在本地计算机上运行良好 但是如果我针对另一台计算机上托管的 SQL 服务器运行此应用程序 则会出现以下错误 Microsoft SqlServer Management Smo Faile
  • 使用 R.Net 版本 1.5.5 创建 REngine 实例

    我正在尝试创建一个 Hello World 示例R Language using R Net版本1 5 5 从 NuGet 加载 不幸的是 我见过的在线示例都不起作用 这就是我所做的 已安装Microsoft R Open 3 2 4 增强
  • 有没有办法使用 ews c# 确定电子邮件是否是回复/响应?

    我正在编写一个支持系统 这是我第一次使用 EWS 到目前为止 我已经相当成功了 我可以提取我需要的信息 发送电子邮件 一切正常 我确实有点头疼 有没有办法判断电子邮件是否实际上是回复 该应用程序的基本思想是有人发送电子邮件 我们回复并给他们
  • 在“delete this;”语句期间发生了什么?

    请考虑以下代码 class foo public foo foo void done delete this private int x 以下两个选项中发生了什么 并且有效吗 选项1 void main foo a new foo a gt
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • 使用 C# 启动 Outlook

    我可以让 C 在代码中启动 Outlook 吗 在 VB6 中 我们使用对象 Outlook Application 并编写 Set oOutlook CreateObject Outlook Application Set oNameSp
  • C#:如何确定坐标是否在美国大陆?

    我正在获取坐标 纬度 经度 我想检查这些坐标是否位于美国大陆 有没有一种简单的方法可以在 C 中实现 我可以将坐标转换为 MGRS 或 UTM 谢谢 哇哦 他们专门为你准备了 http econym org uk gmap states x
  • 有没有一种方法可以在 TreeView.Nodes 集合中搜索 TreeNode.Text 字段?

    像这样 TreeNode treeNodes treeView Nodes Find searchString true 但我希望它在text字段而不是name field 我不知道有任何内置方法 但你可以使用 LINQ TreeNode
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • 调用 Console.ReadLine() 的方法的 C# 单元测试

    我想为名为的类的成员函数创建一个单元测试ScoreBoard它存储了一场比赛中排名前五的球员 问题是我为 SignInScoreBoard 正在呼叫Console ReadLine 这样用户就可以输入他们的名字 public void Si
  • 如何将8字节的十六进制数输入到char数组中?

    我想生成以以下开头的十六进制数字序列07060504003020100 下一个数字是0f0e0d0c0b0a0908等等按这个顺序 当我使用unsigned long long int并输出数据的前4位 这意味着0被截断 它打印706050
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • 在 C++ 中运行 python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个用 C 编写的应用程序和一个测试系统 也是用 C 编写的 测试系统非常复杂并且很难改变 我只想做一些小的改变 我的班级是这样的
  • 如何获取 EF 中的实体更改增量?

    我只需要获取已更改字段的列表 数据存储区是 ssce 因此没有可用的触发器 EF 是否支持获取列表或构建通用组件 根据上下文的类型和生成的实体 您可以通过多种不同的方式来完成此操作 如果对象继承自 Entity 或 POCO 您可以使用Ob
  • 在运行时生成可执行文件

    好吧 所以我想知道如何创建一个程序 该程序创建第二个程序 就像大多数压缩程序如何创建自解压自可执行文件一样 但这不是我需要的 假设我有 2 个程序 每个都包含一个类 我将使用一个程序来修改类并用数据填充类 第二个文件将是一个也具有该类的程序
  • 以编程方式将 UserControl 从 ContentControl 移动到另一个 ContentControl

    在 WPF 应用程序中 我想在代码中将 UserControl 从 ContentControl 移动到另一个控件 myContentControl2 Content myUserControl 在这种情况下我得到一个错误 指定的元素已经是
  • TransactionScope 在某些机器上自动升级到 MSDTC?

    在我们的项目中 我们使用 TransactionScope 来确保我们的数据访问层在事务中执行其操作 我们的目标是not要求在我们的最终用户的计算机上启用 MSDTC 服务 问题是 在我们一半的开发人员机器上 我们可以在禁用 MSDTC 的
  • 删除指针后将其设为 NULL 是一个好习惯吗?

    我首先要说的是 使用智能指针 您将永远不必担心这个问题 下面的代码有什么问题 Foo p new Foo use p delete p p NULL 这是由答案和评论 https stackoverflow com questions 19

随机推荐