2016-09-24 119 views
0

我正在接收“24-9-2016 13:30”格式的日期结构。现在我想将时间值转换为特定的日期值,我正在进行计算,并有几个小时来添加或减少。想要使用struct tm执行日期/时间值操作

所以我不知道:

  • 我怎么能初始化tm结构与日期值我有吗?
  • 如何在tc结构变量中添加或减去小时以获取所需日期?

我的意图是获得
日期 “24-9-2016 13时30分” 和5小时添加
所以最终的日期: “24-9-2016 18点半”

//Temporarily init time to local 

time_t tempTime 
time(&tempTime); 
struct tm *initStruct = localtime(&tempTime);//initialize it with local time 
//now modify it to user defined date 
initStruct ->tm_year = 2016; 
initStruct->tm_mon = 9; 
initStruct->tm_hour = 13; 
. 
. 
. 
//Not sure how can I subtract or add hours in this struct to get desired date value 

这是关于格式化用户定义不是重复。

+1

可能的重复[如何计算IANA时区名称在C中的UTC偏移](http://stackoverflow.com/questions/26845638/how-to-calculate-utc-offset-from-iana-timezone-name- in-c) –

+0

如果您想要一个工业级解决方案,请访问以下网址:http://userguide.icu-project.org/datetime/timezone/examples - libicu是C中标准方式,用于在任意时区之间转换时间。 –

+0

不是真的,日期来自用户,需要执行额外的步骤,主要的是我怎么可以添加或减去一个struct tm。 – user987316

回答

2
#define _XOPEN_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(void) { 
    struct tm tm = {0}; 
    if (!strptime("24-9-2016 13:30", "%d-%m-%Y %H:%M", &tm)) { 
     return EXIT_FAILURE; 
    } 

    tm.tm_hour += 5; 
    tm.tm_isdst = -1; 
    mktime(&tm); 

    char buf[40]; 
    if (!strftime(buf, sizeof buf, "%d-%m-%Y %H:%M", &tm)) { 
     return EXIT_FAILURE; 
    } 

    printf("result: %s\n", buf); 
    return EXIT_SUCCESS; 
} 

点注意事项:

  • 我们初始化tm为全零,然后用strptime解析输入字符串。
  • 加入5小时就像tm_hour += 5一样简单。
  • 我们设置tm_isdst-1告诉mktime自动判断夏令时是否应该生效。
  • 之后我们调用mktime(&tm)来规范时间结构(例如,在23:30加5小时应该导致04:30(并增加当天),而不是28:30)。
  • 我们用strftime将结果转换回人类可读形式。

一个可能的问题是这将输出24-09-2016 18:30,即它将使用零填充月份/天数到2个位置。如果您不需要,您必须手动打印/格式化tm字段。

+0

是的,那是我想要做的事情。谢谢@melpomene。有一件事是,我的代码将在solaris中运行,并且我不认为strptime()在那里可用。那里有其他选择吗?或者我将不得不编写自己的代码来完成strptime内部完成的任务? – user987316

+0

@ user987316根据http://docs.oracle.com/cd/E23824_01/html/821-1465/strptime-3c.html#scrolltoc,可以使用'strptime'。 – melpomene

+0

如果我必须添加4.5小时值,我该怎么做? tm_hour是int。 – user987316