localtime错误的时间()

问题描述 投票:0回答:4

运行dateon我的服务器会产生正确的时间。但是在C(++)中使用localtime()我的时间错了。

运行dateFr 30. Nov 12:15:36 CET 2012

使用localtime()Fr 30 Nov 2012 11:15:36 CET

这有什么不对?

操作系统:Debian 5.0.10

一些代码:

struct tm* today;
today = localtime(...);
strftime(timeBuffer,50,myConnection.getMetaData().getDateFormat().c_str(),today);
c++ c
4个回答
0
投票

免责声明:这个答案是在添加任何strftime之前写的,并且是对时间戳1小时差异的直觉反应。现在回过头来看,1小时的差异不可能是由于夏令时(因为日期不是夏天),但很可能显示UTC时间戳(UTC和CET之间的1小时差异)。

不幸的是,答案被接受了,所以我无法删除它。更不幸的是,如果没有其他信息,现在的问题是无法回答的。

将原始答案留在这里是为了完全透明,但要知道它没有解决问题:

struct tm返回的localtime有一个tm_isdst字段,表明夏令时(DST)是否有效。格式化时间时,您需要考虑该字段。

尝试使用asctime格式化时间,例如。 :

puts(asctime(today));

0
投票

你试过这个吗? :

 time_t rawtime;
 struct tm * today;

 time ( &rawtime );
 today= localtime ( &rawtime );
 puts(asctime (today))

0
投票

处理日期时间非常容易出错并且通常会经过严格测试。我总是建议使用boost :: date_time http://www.boost.org/doc/libs/1_52_0/doc/html/date_time.html

这里有很好的例子http://en.highscore.de/cpp/boost/datetime.html


0
投票

在编写日期调整例程时,我遇到了同样的问题。将86400秒(= 1天)添加到任何给定的日期时间值应该会导致日期时间值增加一天。但是在测试中,输出值总是在预期输出上加上一个小时。例如,'2019-03-20 00:00:00'增加86400秒,导致'2019-03-21 01:00:00'。反过来也发生了:'2019-03-21 00:00:00'递减-86400导致'2019-03-20 01:00:00'。

解决方案(莫名其妙地)是在将最终间隔应用到输入日期时间之前从最后间隔减去3600秒(一小时)。

解决方案(感谢来自@ Lightness-Races-in-Orbit的有用评论)是在调用tm_isdst之前将mktime()设置为-1。这告诉mktime()输入日期时间值的DST状态是未知的,并且mktime()应该使用系统时区数据库来确定输入日期时间值的正确时区。

该函数(如下所述)允许对天进行任何整数调整,现在可以产生一致的正确结果:

#include <stdio.h> 
#include <string.h>
#include <time.h>        

/*******************************************************************************
 *  \fn             adjust_date()
 *******************************************************************************/

int adjust_date(
                        char    *original_date,
                        char    *adjusted_date,
                        char    *pattern_in,
                        char    *pattern_out,
                        int      adjustment,
                        size_t   out_size)
{
/*
struct tm {
    int tm_sec;         // seconds          0-59
    int tm_min;         // minutes          0-59
    int tm_hour;        // hours            0-23
    int tm_mday;        // day of the month 1-31
    int tm_mon;         // month            0-11
    int tm_year;        // year       minus 1900
    int tm_wday;        // day of the week  0-6
    int tm_yday;        // day in the year  0-365
    int tm_isdst;       // daylight saving time 
};
*/
    struct tm day;

    time_t one_day = 86400;
//  time_t interval = (one_day * adjustment) - 3600;
    time_t interval = (one_day * adjustment);

    strptime(original_date, pattern_in, &day);

    day.tm_isdst = -1;
    time_t t1 = mktime(&day);

    if (t1 == -1) {
        printf("The mktime() function failed");
        return -1;
    }

    time_t t2 = t1 + interval;

    struct tm *ptm = localtime(&t2);

    if (ptm == NULL) {
        printf("The localtime() function failed");
        return -1;
    }

    strftime(adjusted_date, out_size, pattern_out, ptm);

    return 0;
}

/*******************************************************************************
 *  \fn             main()
 *******************************************************************************/
int main()
{
    char    in_date[64]     = "20190321000000" ,
            out_date[64],
            pattern_in[64]  = "%Y%m%d%H%M%S",
            pattern_out[64] = "%Y-%m-%d %H:%M:%S";

    int     day_diff = -1,
            ret = 0;

    size_t  out_size = 64;

    memset(out_date, 0, sizeof(out_date));

    ret = adjust_date(in_date, out_date, pattern_in, pattern_out, day_diff, out_size); 

    if (ret == 0)
    {
        printf("Adjusted date: '%s'\n", out_date);
    }

    return ret;
}

希望这对某些人有所帮助。非常感谢您的建设性意见。

© www.soinside.com 2019 - 2024. All rights reserved.