这是一个简单的问题,但解决方案似乎远非简单.我想知道如何从UTC转换为本地时间.我正在寻找一个标准的C解决方案,或多或少保证可以在任何位置的任何计算机上工作.
我仔细阅读了以下链接,但我找不到解决方案:
我尝试了很多变体,例如(datetime是一个带有时间和日期的字符串,以UTC表示):
strptime(datetime, "%A %B %d %Y %H %M %S", tp);
strftime(printtime, strlen(datetime), "%A %B %d %Y %H %M %S", tp);
Run Code Online (Sandbox Code Playgroud)
要么
strptime(datetime, "%A %B %d %Y %H %M %S", tp);
lt=mktime(tp);
printtime=ctime(<);
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,printtime最终都与UTC相同.
编辑11-29-2013:基于下面"R"的非常有用的答案,我终于开始创建一个工作示例.我发现它在我测试它的两个时区中正常工作,CET和PST:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
long long diff_tm(struct tm *a, struct tm *b)
{
return a->tm_sec - b->tm_sec
+60LL*(a->tm_min - b->tm_min)
+3600LL*(a->tm_hour - b->tm_hour)
+86400LL*(a->tm_yday - b->tm_yday)
+(a->tm_year-70)*31536000LL
-(a->tm_year-69)/4*86400LL
+(a->tm_year-1)/100*86400LL
-(a->tm_year+299)/400*86400LL
-(b->tm_year-70)*31536000LL
+(b->tm_year-69)/4*86400LL
-(b->tm_year-1)/100*86400LL
+(b->tm_year+299)/400*86400LL;
}
int main()
{
time_t …Run Code Online (Sandbox Code Playgroud) SVN工作得很好,直到几分钟前 - 我仍然可以在http://svn.example.com/myrepo浏览我的存储库但是当我尝试执行任何操作时,包括svn up,我得到:
svn: OPTIONS of 'http://svn.example.com/myrepo': 200 OK (http://svn.example.com)
Run Code Online (Sandbox Code Playgroud)
当我试图svn cleanup http://svn.example.com/myrepo看看会发生什么时,我得到了:
svn: 'http://svn.example.com/myrepo' does not exist
Run Code Online (Sandbox Code Playgroud)
再次 - 在浏览器中键入它,我仍然可以正常浏览存储库.这是怎么回事??
我创建了一个程序,该程序定期从网站下载文本文件,该文件采用csv格式,并对其进行解析,提取相关数据,然后显示.
我注意到,偶尔,每隔几个月左右,它会崩溃.考虑到数据下载和解析的周期可以每5分钟甚至更短时间发生,因此崩溃很少见.我很确定它在解析字符串并提取数据的函数内崩溃.当它崩溃时,它发生在拥挤的互联网连接期间,即大量下载和/或慢速连接.有时,远程站点可能正在处理损坏或不完整的数据.
我使用了一个测试应用程序,它在处理之前保存要处理的数据,并且确实表明在发生崩溃时它没有完成.
我已经调整了该函数以适应大量无效或不完整数据的情况,以及检查所有返回值.我还检查用于连接到远程站点的各种函数的返回值并下载数据.当返回值表示没有成功时,不会更进一步.
该函数的核心使用strsep()来遍历数据并从中提取信息:
/ *
* delimiters typically contains: <;>, <">, < >
* strsep() is used to split part of the string using delimiter
* and copy into token which then is copied into the array
* normally the function stops way before ARRAYSIZE which is just a safeguard
* it would normally stop when the end of file is reached, i.e. \0
*/
for(n=0;n<ARRAYSIZE;n++)
{
token=strsep(©_of_downloaded_data, delimiters);
if (token==NULL)
break;
data->array[n].example=strndup(token, strlen(token));
if (data->array[n].example!=NULL)
{
token=strsep(©_of_downloaded_data, …Run Code Online (Sandbox Code Playgroud)