2

私のサーバーで実行dateすると、正しい時刻になります。しかしlocaltime()、C(++)で使用すると、間違った時間が発生します。

実行中dateFr 30. Nov 12:15:36 CET 2012

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

ここで何が問題になっていますか?

OS:Debian 5.0.10

いくつかのコード:

struct tm* today;
today = localtime(...);
strftime(timeBuffer,50,myConnection.getMetaData().getDateFormat().c_str(),today);
4

4 に答える 4

2

免責事項:この回答は、言及strftimeが追加される前に書かれたものであり、タイムスタンプの1時間の違いに対する直感的な反応でした。今振り返ると、その1時間の差はDSTによるものではなかった可能性があります(日付が夏ではないため)が、UTCタイムスタンプ(UTCとCETの1時間の差)を示している可能性があります。

残念ながら回答を受け付けたので削除できません。さらに残念なことに、現状の質問は追加情報なしでは答えられないということです。

完全な透明性のために元の回答をここに残しますが、質問された質問に対処していないことを知ってください:

struct tmによって返されるlocaltimeには、夏時間tm_isdst(DST)が有効であるかどうかを示すフィールドがあります。時間をフォーマットするときは、そのフィールドを考慮する必要があります。

asctime時間をフォーマットするために使用してみてください。:

puts(asctime(today));
于 2012-11-30T11:36:55.270 に答える
1

日付調整ルーチンを書いているときに同じ問題が発生しました。任意の日時値に86400秒(= 1日)を追加すると、日時値が1日増加しますただし、テストでは、出力値は常に期待される出力に正確に1時間追加されました。たとえば、「2019-03-20 00:00:00 を86400秒インクリメントすると、「2019-03-2101 :00:00」になります。逆も発生しました:「2019-03-21 00:00:00」は、 -86400によってデクリメントされ、「2019-03-2001 :00:00」になりました。

解決策は(不可解に)、入力日時に適用する前に、最終間隔から3600秒(1時間)を引くことでした。

解決策(@ Lightness-Races-in-Orbitからの有益なコメントのおかげで)は、をtm_isdst呼び出す前に-1に設定することmktime()でした。これは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;
}

うまくいけば、これは誰かの助けになるでしょう。建設的なコメントをいただければ幸いです。

于 2019-04-02T13:14:41.403 に答える
0

これを試しましたか?:

 time_t rawtime;
 struct tm * today;

 time ( &rawtime );
 today= localtime ( &rawtime );
 puts(asctime (today));
于 2012-11-30T11:55:25.030 に答える
0

日時の処理は非常にエラーが発生しやすく、通常はテストが不十分です。私は常にboost::date_timehttp://www.boost.org/doc/libs/1_52_0/doc/html/date_time.htmlを使用することをお勧めします

ここに良い例がありますhttp://en.highscore.de/cpp/boost/datetime.html

于 2012-11-30T12:42:28.483 に答える