C言語の質問です。YYYY/MM/DD HH:MM:SSで記述された文字列があります。この文字列に1秒加算した場合の文字列を求めるロジックのサンプルはありませんでしょうか?

例)2004/12/31 23:59:59 ⇒ 2005/01/01 00:00:00 というように。(閏年の考慮は必須です)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/08/07 22:31:11
  • 終了:--

回答(3件)

id:masahikokimoto No.1

masahikokimoto回答回数241ベストアンサー獲得回数102005/08/07 22:41:56

ポイント10pt

URLはダミーです。

まず。文字列を適当のパースして各項目の数値を取り出します。面倒ならsscanfで良いでしょう。

それをstruct tmに代入します。

で、mktime(3)でtime_tの値に変換し、+1して、gmtime(3)でstruct tmに戻し、asctime(3)で文字列に変換します。

詳しくはman ctime してください。

id:goldman

2037年以降の計算をする場合には,この方法は使えませんよね。次の方からはacstime を使わずに行う方法をお願いします。(ちょっと業務で使いたいので・・・)

2005/08/07 22:53:11
id:new_icu No.2

new_icu回答回数13ベストアンサー獲得回数02005/08/07 23:41:18

http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...

MSDN ライブラリ サイト移行に関する重要なお知らせ

となると、やはり、ctimeに関するところを自作するしかないのではないでしょうか?

 VC++7以降だと__time64_t, _ctime64があるんですけど、環境依存してしまいますね。

id:goldman

VC++ではなく、C言語と明記しています。自作する予定でしたがロジックが思いつかないので参考になるサンプルの質問をしているのを理解してください。

2005/08/08 00:47:37
id:nitscape No.3

nitscape回答回数526ベストアンサー獲得回数02005/08/08 00:20:08

ポイント50pt

http://www.dinop.com/vc/isuruudoshi.html

うるう年かどうかを判定 : www.dinop.com

うるう年の判定方法です。


後は単純に足し算をするだけです。


ロジック的には...


秒が59でしたら00にして分に1を加算。(加算する前の)分が59だった場合には00にして時に1を加算。時が23だったなら日に1を加算。日が月末(毎月のデータを配列で用意するなりして判定。うるう年に注意)だったら1にして月を加算。月が12だったら年を加算。


という形になります。しかし業務用途にせよ1番の方の方法を取るのが普通だと思います。バグの可能性も減らせますし。もちろん仕様で要求されていれば別ですが。

http://jjy.nict.go.jp/QandA/data/leapsec.html

���{�W�����v���W�F�N�g�@Information of Leap second

このロジックとは別に年によってはうるう秒が加算される場合があります。


2005年12月31日23時59分59秒に1秒足すと

2005年12月31日23時59分60秒になります。


うるう秒は不定期に加算されるため、過去のうるう秒は分かりますが、数十年先の将来に関しては不明なため、計算で誤差が生じます(これはどうしようもありません)。

id:goldman

了解です。ただAIXでは1の方法では特定のパターンでバグがあるため正確に動作しないためです。

2005/08/08 00:50:13

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません