0

カレンダープログラムを作っています。'expand repeating events'コードは、私に問題の終わりを与えていません。mktime()を使用して「純粋な」時間値を取得し、それに繰り返しデルタ(この場合は604800秒または7日)を追加することで、イベントを拡張しています。次に、localtime()を使用して、カレンダー構造体を元に戻します。

これは起こります:

元のイベント:9月10日

{tm_sec = 0, tm_min = 0, tm_hour = 16, tm_mday = 10, tm_mon = 9,
 tm_year = 2012, tm_wday = 4, tm_yday = 283, tm_isdst = 0, 
 tm_gmtoff = -25200, tm_zone = 0x608ff0 "PDT"}

最初の繰り返し:9月17日

{tm_sec = 0, tm_min = 0, tm_hour = 17, tm_mday = 17, tm_mon = 9,
 tm_year = 2012, tm_wday = 4, tm_yday = 290, tm_isdst = 1, 
 tm_gmtoff = -25200, tm_zone = 0x608ff0 "PDT"}

2回目の繰り返し:9月24日

{tm_sec = 0, tm_min = 0, tm_hour = 16, tm_mday = 24, tm_mon = 9,
 tm_year = 2012, tm_wday = 4, tm_yday = 297, tm_isdst = 0,
 tm_gmtoff = -25200, tm_zone = 0x608ff0 "PDT"}

3回目の繰り返し:9月31日?!

{tm_sec = 0, tm_min = 0, tm_hour = 16, tm_mday = 31, tm_mon = 9,
 tm_year = 2012, tm_wday = 4, tm_yday = 304, tm_isdst = 0,
 tm_gmtoff = -25200, tm_zone = 0x608ff0 "PDT"}

ここで何が起こっているのか誰かが知っていますか?自分で記入する必要がありlocaltime()ますか?

4

2 に答える 2

4

ドキュメントから:構造体のメンバーstruct tmは0ベースです(通常はCのように)。

int    tm_mon   month of year [0,11]

つまり、実際に番号が付けられている月9は10月である10月であり、31日です。

于 2012-12-01T21:36:37.807 に答える
2

H2CO3が指摘しているように、tm_monは0ベースであるため、日付は実際には10月31日であり、これは理にかなっています。

7日進むために604800秒を追加するだけでは、おそらくユーザーがカレンダープログラムに望むものではないことを述べておきたいと思います。604800は正確に7日ですが、ユーザーが7日ごとに午前10時に定期的なイベントを希望する場合、夏時間やうるう秒などの特別な考慮事項を無視するため、604800秒を追加しても必ずしも午前10時になるとは限りません。 。

代わりにできることは、に7を追加することですtm_mdaymktime()修正されるので、月の日数を超えても心配しないでください。

于 2012-12-01T21:52:43.707 に答える