2

入力日時 (文字列形式) を指定すると、 liketimeで指定された関数を使用してエポック時間を取得しようとしています。エポック時間を日付と時刻に戻すと、元の日付と時刻より 1 時間少ない日付と時刻になります。私はいくつかの議論を経て、サマータイムの場合には 1 時間の調整があるかもしれないと言っています. コードは次のとおりです。 ctimemktimetime_t

//sample strptime program.

#include <iostream>
#include <ctime>
#include <string>
using namespace std;

long parseTime(string time) {

  cout << "Time entered = " << time << endl;

  long timeSinceEpoch;

  struct tm t;

  if(time.find("/") != string::npos) {
    //format of date is mm/dd/yyyy. followed by clock in hh:mm (24 hour clock).
    if(strptime(time.c_str(), "%m/%e/%Y %H:%M", &t) == NULL) {
      cout << "Error. Check string for formatting." << endl;
    }
  } else if(time.find("-") != string::npos) {
    //format of date is yyyy-mm-dd hh:mm:ss (hh in 24 hour clock format).
    cout << "I am here." << endl;
    if(strptime(time.c_str(), "%Y-%m-%e %H:%M:%S", &t) == NULL) {
      cout << "Error. Check string for formatting of new date." << endl;
    }
  }

  cout << "Details of the time structure:" << endl;
  cout << "Years since 1900 = " << t.tm_year << endl;
  cout << "Months since January = " << t.tm_mon << endl;
  cout << "Day of the month = " << t.tm_mday << endl;
  cout << "Hour = " << t.tm_hour << " Minute = " << t.tm_min << " second = " << t.tm_sec << endl;

  timeSinceEpoch = mktime(&t);
  time_t temp = mktime(&t);
  cout << "Time since epoch = " << timeSinceEpoch << endl;

  cout << "Reconverting to the time structure:" << endl;
  struct tm* t2 = localtime(&temp);
  cout << "Details of the time structure:" << endl;
  cout << "Years since 1900 = " << t2->tm_year << endl;
  cout << "Months since January = " << t2->tm_mon << endl;
  cout << "Day of the month = " << t2->tm_mday << endl;
  cout << "Hour = " << t2->tm_hour << " Minute = " << t2->tm_min << " second = " << t2->tm_sec << endl;

  return timeSinceEpoch;
}

int main(int argc, char *argv[]) {

  string date, t;
  cout << "Enter date: " << endl;
  cin >> date;
  cout << "Enter time: " << endl;
  cin >> t;

  struct tm time;
  string overall = date + " " + t;

  long result = parseTime(overall);
  cout << "Time in date + time = " << overall << " and since epoch = " << result << endl;

return 0;
}

面倒な入力は次のとおりです: date: 2013-03-11 time: 04:41:53

私の質問:
1.tm_idstフラグを確認すると、DST が有効であることを示すゼロ以外の値が返されます。しかし、どのタイムゾーンが話題になっているのかを知るにはどうすればよいでしょうか?
2. 上記のタイムスタンプは、私がいるタイムゾーンと同じタイムゾーンで記録されていない可能性があります。tm_idstフラグが正しく設定されるようにタイムゾーンを指定する方法はありますか?
3. タイムスタンプが記録されたタイムゾーンがわからない場合、DST をどのように処理すればよいですか?

4

1 に答える 1

2

PlainC++はタイムゾーン データがかなりまばらで、フォーマットされる時間にタイムゾーンの指定がないと、一貫性のない結果が得られる期間がいくつかあります。これが、すべてのタイムスタンプを記録することが常に推奨される理由です。UTCつまり、記録されたタイムスタンプにタイムゾーンを適用せ、GMT で記録し、その値を表示変数として行ったり来たりしないでください。これは完全に制御できます。

Linux/BSD には、タイムゾーンと UTC からのオフセットを決定するために使用できるいくつかの追加フィールドがあります。たとえば、Linux では__tm_gmtoffフィールドであり、BSD(/Mac OS X) では と呼ばれtm_gmtoffます。

__tm_zoneLinux およびBSD(/Mac OS X) には、タイムゾーンにラベルを付ける追加のフィールドがありますが、そのフィールドはローカルタイムtm_zoneを取得した場合にのみ入力されます。

例を少し変更して、次の出力を得ました。

Time entered = 2013-04-05 15:00
I am here.
Error. Check string for formatting of new date.
Details of the time structure:
Years since 1900 = 113
Months since January = 3
Day of the month = 5
Hour = 15 Minute = 0 second = 0
gmtoff = 0
Time since epoch = 1365174000
Reconverting to the time structure:
Details of the time structure:
Years since 1900 = 113
Months since January = 3
Day of the month = 5
Hour = 16 Minute = 0 second = 0
gmtoff = 3600
Zone = IST
Time in date + time = 2013-04-05 15:00 and since epoch = 1365174000

ただし、Windows でこの構造を使用している場合は、これら 2 つの追加フィールドがないため、別のメカニズムを使用する必要があります。

于 2013-03-27T19:36:17.103 に答える