1

私には2つの機能があります。最初のものは time_t を文字列に変換します。2 番目の文字列は time_t に。変換して文字列として復元する必要がある日付があります。

関数は次のとおりです。

void split(const string &s, char delim, vector<string>& elems) {
    stringstream ss(s); string item; 
    while(getline(ss, item, delim)) { elems.push_back(item);} return;
}

time_t getDateInTimeTfromHyphenSplitString(string s)
{
    struct tm tmvar = {0};
    vector<string> tim;
    split(s.c_str(),'-',tim);
    tmvar.tm_year = atoi(tim[2].c_str()) - 1900;
    tmvar.tm_mon = atoi(tim[1].c_str());
    tmvar.tm_mday = atoi(tim[0].c_str());
    tmvar.tm_isdst = 0;
    time_t ttm = mktime(&tmvar);
    return ttm;
}

string getDateInHyphenSplitStringfromTimeT(time_t t)
{
    struct tm *timeinfo = (tm*)malloc(sizeof(tm));
    gmtime_s(timeinfo, &t);
    char *buffer = NULL;
    buffer = (char*)malloc((size_t)20);
    strftime(buffer, 20, "%d-%m-%Y", timeinfo);
    string s = buffer ;
    return s;
}

このコードを次の行でテストすると、出力が奇妙に見えます。

string sk = "31-12-2010";
cout << sk << endl;
time_t ttk = getDateInTimeTfromHyphenSplitString(sk);
sk = getDateInHyphenSplitStringfromTimeT(ttk );

cout << sk << endl;

入力:- 2010 年 12 月 31 日 出力:- 2011 年 1 月 30 日

奇妙なことに、入力として指定した日付に対して 1 か月の差が生じています。

正しい時刻に戻す方法があれば教えてください。

PS: 日付を「-」でフォーマットする必要があるため、この手法を選択します。

4

1 に答える 1

1

tm_mon「1月からの月数」をカウントするため、値の範囲は0から11です。

入力月から1を引く必要があります。


それとは別に、あなたのコードはメモリをリークします:あなたは決してfreeあなたのmallocedメモリではありません。C ++でプログラミングしているので、malloc / freeをまったく使用せず 、代わりにnew、new []、delete、delete []を使用することをお勧めします。これは、mallocにはオブジェクトの概念がなく、コンストラクターを呼び出さないためです。

関数の特殊なケースでは、動的メモリ割り当てさえまったく必要ありません。

    struct tm timeinfo;
    gmtime_s(&timeinfo, &t);
    char buffer[20];
    strftime(buffer, sizeof(buffer), "%d-%m-%Y", &timeinfo);
于 2012-12-12T15:02:33.030 に答える