DOBON.NET DOBON.NETプログラミング掲示板過去ログ

経過時間から日時を取得するには?

環境/言語:[Windows2000、C#、.NET2003]
分類:[.NET]

はじめまして。
恐縮ですが初心者並の質問をさせて下さい。

C#にて、
基準時刻からの経過時間(秒値)を
年月日時分秒のフォーマットに変更したいのですが、
方法が分かりません。

(逆の、基準時刻から任意の時刻までの経過時間でしたら分かったのですが…。)

恐れ入りますが、ご教授願えませんでしょうか?
TimeSpan.FromSecondsでTimeSpan型の変数に取り込むのがまず最初の処理です。
Timespanは(上記の判断がないため)日までは提供してくれます。
変数tsに受け取ったとして、
時、分、秒はその変数から
ts.Hours
ts.Minutes
ts.Seconds
をstringに組み立てて使用すればよいでしょう。
これらは全てIntegerで、端数は切り捨てられているので何も処理は必要ありません。


問題があるのは、日より上、つまり月と年を換算したいという場合です。

人間が言うところの1999/6/1→2000/6/1はきっと1年ですし、
2004/1/1→2004/2/1はきっと1月でしょうが、
機械では、「経過時間」を元に計算する限り前者は1日多く経っているということになります。
また、2004/2/1→2004/3/1は、1月経っているとも1月経っていないともとれます。
ようは、経過時間を基準にするか、各時点の年月日時分秒を基準にするかで答えは異なります。
(当然H・M・Sは単位が揺れ動かないのでどちらでも常に同じ答えです。)
単位が不定な数になる年や月を「経過」で扱うことは本来はよくないでしょうし、
TimeSpanにその機能はありません。
それでも例えば4000日と言われてもぴんと来ない、等の理由で経過時間基準での概算を
表したい状況もあるので、
その場合には、
例えば「my年」:=365日、「my月」:=30日という基準の下にts.Daysを処理するだけです。
整数計算で、365で割った商はmy年数でしょうし、余りを更に30で割った商はmy月数、
この際の余りはmy日数でしょう。

そしてどうでもいいことかもしれませんが、
何らかのインジケータに経過を年月日時分秒で表示する場合、年月日の部分は上記基準に
よることを表記すべきでしょうね。


そもそも、よほど長期でない限り、日より上は換算しませんよね。
■7336の
> Timespanは(上記の判断がないため)日までは提供してくれます。
の、(上記の判断がないため)はミスです。編集中、色々上に
打ってたのですが消したので、無視してください。
No7336でこどさんがおっしゃっているように、
時間はともかく期間(日数、月数、年数)に関しては
一般的な計算ルールというものがありませんので、
その当たりはまず仕様を決めて、その上で自前の計算が必要になります。

私が以前VB(VB.net以前のVB)で年齢計算を月、日単位まで求めるロジックを
考えていたときに書いた関数があります。↓

http://www5b.biglobe.ne.jp/~yone-ken/VB/Func/vbTips003.txt

ソースコードをそのまま流用することはできませんが、
仕様の部分は参考になるかもしれません。
ソースコードのコメントを読んでいただければ、仕様がわかると思います。
こど。様、よねKEN様、お忙しいところ
時間を割いてくださいまして、ありがとうございました。

Timespanが日までしか提供しないなんて…。

例えば、
TimeSpan ts = DateTime.Now.Subtract(new DateTime(1988, 1, 1, 0, 0, 0));
で基準時刻(1988年1月1日0時0分0秒)から現在時刻までの経過時間を取得できるのに、
その逆を扱えないなんて意外な感じがします。

こうなれば自前で作るしかないのですね。
閏年計算とか面倒そうですが、検討してみます。
解決済み!
2004/11/13(Sat) 10:02:38 編集(投稿者)

■No7343に返信(y-ikeuchiさんの記事)
> 例えば、
> TimeSpan ts = DateTime.Now.Subtract(new DateTime(1988, 1, 1, 0, 0, 0));
> で基準時刻(1988年1月1日0時0分0秒)から現在時刻までの経過時間を取得できるのに、
> その逆を扱えないなんて意外な感じがします。

経過時間を年月日時分秒のような表記にするのは全然逆の操作じゃないと思いますが・・・。

最初の質問文を読み返したのですが、私が思い切り誤解していたのかも。
ひょっとして、探されている機能はDateTime.Add(TimeSpan)でしょうか?
基準日時に経過時間を足せば、その経過時間計測時の現在日時は求まります。
解決済み!
平ちゃん様、解決済みのスレッドに
更なるアドバイスを書き込んでいただき、ありがとうございます!
「Datetime.AddDay(Integer)」が大ヒントでした!

また、よねKEN様も重ねて御礼申し上げます。
今ちょうど、本当に本当の「解決」したところです♪
説明が下手で申し訳なかったです。

以下、自己レス(になるのかな?)です。

//経過時間(秒値)をセット
int iSec = 0x2EC09D1A;
//基準時刻をセット
DateTime dt = new DateTime(1988, 1, 1, 0, 0, 0);
//基準時刻に経過時間を加算
dt = dt.AddSeconds(iSec);
//年月日時分秒を取得
int iYear = dt.Year;
int iMonth = dt.Month;
int iDay = dt.Day;
int iHour = dt.Hour;
int iMinute = dt.Minute;
int iSecond = dt.Second;
解決済み!
■No7346に返信(よねKENさんの記事)
> 2004/11/13(Sat) 10:02:38 編集(投稿者)
>
> ■No7343に返信(y-ikeuchiさんの記事)
>>例えば、
>>TimeSpan ts = DateTime.Now.Subtract(new DateTime(1988, 1, 1, 0, 0, 0));
>>で基準時刻(1988年1月1日0時0分0秒)から現在時刻までの経過時間を取得できるのに、
>>その逆を扱えないなんて意外な感じがします。
>
> 経過時間を年月日時分秒のような表記にするのは全然逆の操作じゃないと思いますが・・・。
>
> 最初の質問文を読み返したのですが、私が思い切り誤解していたのかも。
> ひょっとして、探されている機能はDateTime.Add(TimeSpan)でしょうか?
> 基準日時に経過時間を足せば、その経過時間計測時の現在日時は求まります。
>

今日は 平ちゃんです。
経過時間を年月日で表示する方法ですが年、月、日を Integer で取得し
引き算をする方法で出来そうですが?
(例)
対象日 2004年3月5日
基準日 2004年1月10日

日の計算
 負になるので対象月(この場合1月)の日数(1月は31日)を5日に加えて
 36とし36−10=26日
 対象月の日数は 翌月の1日をDatetime1とすると
 Datetime1=Datetime1.AddDay(-1) で日部分を取得すればできます。
月の計算
 3月ですが日の計算に使用したので2月となる。
 2−1=1
年の計算
 2004−2004 =0

結果 1月26日(1月と26日と読む?)

ね、出来そうなきがするでしょう。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板