set_time()
関数は、特定の時間をとり、この時間に指定された分数を加算して*t
に保存することになっています。だから、UTC時刻を含むstruct tmに分を追加するにはどうすればよいですか?
#include <stdio.h>
#include <time.h>
enum {JAN, FEB, MAR, APR, MAY, JUNE, JULY, AUG, SEP, OCT, NOV, DEC};
void set_time(struct tm *t,
int year, int mon, int day,
int hour, int min, int sec,
int mins_to_add)
{
/* Copy all the values. */
t->tm_year = (year - 1900);
t->tm_mon = mon;
t->tm_mday = day;
t->tm_hour = hour;
t->tm_min = min;
t->tm_sec = sec;
// No DST since we are storing UTC time.
t->tm_isdst = 0;
/* Add minutes to time. */
t->tm_min += mins_to_add;
mktime(t);
/* Debug print */
printf("%s\n", asctime(t));
}
int main(int argc, char **argv)
{
struct tm t;
set_time(&t, 2011, AUG, 1, 10, 00, 00, 0);
return 0;
}
、私は、WindowsのシステムはESTのタイムゾーンに設定されている場合は、私が手に出力された8月1日に午前10時00分00秒2011年には何も追加しないようにset_time()
を頼む:Mon Aug 01 11:00:00 2011
上記の例で指定された時間(上記の例では0)を指定された時間(上記の例では2011年8月1日10:00:00)に追加する作業を行うため、エラーが発生します。
/* Add minutes to time. */
t->tm_min += mins_to_add;
mktime(t);
mktime()
は、他のすべてのmembを調整するために呼び出されます追加のためにt->tm_min
が59を超える場合の構造体の変数。しかしmktime()
は、struct tm
オブジェクトの時刻を現地時間として扱います。したがって、日付が2011年8月1日で、ローカルタイムゾーンがESTであると見なされると、DSTを適用する必要があるとみなされますが、t->tm_isdst
は0
に設定されます(DSTは*t
の時刻に適用されません)。したがって、DSTを適用し、2011年8月1日10:00:00から2011年8月1日11:00:00までの日付を調整し、t->tm_isdst
を1
に設定します。
私は1
にt->tm_isdst
を初期化持っていたmktime()
は*t
の時間がすでにDSTがそれに適用されていることがわかっているだろうので、この問題は発生していません。しかし、set_time()
に、DSTが適用されてはならない日付に何も追加しないように頼んだら、Jan 01 10:00:00 2011と言うと、結果が乱れてしまいました.DSTをオフにして、*t
t->tm_isdst
を0に設定し、Jan 01 09:00:00 2011に日付を再調整してください。
この結果、これは、指定した時刻に余分な時間を追加したり、余分な時間を差したりするという望ましくない効果がありますそれに何も追加しない。これは、mktime()
がt->tm_isdst
のDST設定がシステムの現地時間帯にあるべきでないと判断した場合、時刻を*t
に再調整して正しく設定しようとするためです。
この問題を解決する正しい方法は何ですか?
おそらく関連しています。間違いなく、dupe:http://stackoverflow.com/questions/530519/stdmktime-and-timezone-info – ruakh
ruakh、あなたが言及した投稿は密接に関連していますが、類似していません。問題は、 'mktime()'によって返されたタイムスタンプからタイムゾーンオフセットを差し引くことを含むきちんとした回避策があります。しかし、私の問題は、 'struct tm'オブジェクトのある時間に特定の分数を追加し、' mktime() 'がDST設定のために日付から余分なものを追加または減算しないことを確認することです。 –