C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 日付計算から週単位に変換する方法


(過去ログ 173 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■99693 / inTopicNo.1)  日付計算から週単位に変換する方法
  
□投稿者/ 河童 (5回)-(2022/05/13(Fri) 17:53:00)

分類:[C#] 

日付計算から週単位に変換する方法する方法を教えてください。
わからない点は、小数点の切り上げがあったときどのように処理すればいいかです。

起算日から記録した日が何週間目にあたるのか計算したいです。

起算日から記録日の日差を求めて、週単位にしたいので「7」で割っています。

戻り値はint型にしたいです。

どのように計算すればよいでしょうか。よろしくお願いいたします。
求める結果
起算日:5月1日
記録日:5月15日
週:3


public int Date_Week(string sdate, string edate)
{
     // 起算日
     sdate = "20220501";
     // 終了日(記録日)
     edate = "20220515";

     // 日付変換
     DateTime d1t = DateTime.ParseExact(sdate, "yyyyMMdd", null);
     DateTime d2t = DateTime.ParseExact(edate, "yyyyMMdd", null);

     // 日差
     TimeSpan tp = d2t - d1t;
     int difDay = tp.Days + 1;

     // 週単位に変換
     int week = difDay / 7;

     return week;
}

引用返信 編集キー/
■99694 / inTopicNo.2)  Re[1]: 日付計算から週単位に変換する方法
□投稿者/ 魔界の仮面弁士 (3359回)-(2022/05/13(Fri) 18:06:25)
No99693 (河童 さん) に返信
> 起算日から記録した日が何週間目にあたるのか計算したいです。

「〜週間経過」ならば、当日は 0 週としてカウントされますが、
「〜週間目」という表現だと、当日は 1 週目としてカウントされますね。

> 起算日:5月1日
> 記録日:5月15日
> 週:3
2022 年だと、それはどちらも日曜日ですね。


それでは別の曜日だった場合…たとえば
 起算日:2022/05/07(土)
 記録日:2022/05/08(日)
の場合、これは幾つにカウントしたいのでしょうか?


【A案】2 とカウント:7日(土)を1週目、8日(日)〜14日(土)は2週目、15日(日)〜21日(土)が3週目。
【B案】1 とカウント:7日(土)〜13日(金)を1週目、14日(土)〜20日(金)は2週目。
【C案】1 とカウント:7日(土)〜8日(日)を1週目、9日(月)〜15日(日)は2週目、16日(月)〜22日(日)が3週目。
【D案】上記以外
引用返信 編集キー/
■99695 / inTopicNo.3)  Re[2]: 日付計算から週単位に変換する方法
□投稿者/ 河童 (7回)-(2022/05/13(Fri) 18:33:52)
No99694 (魔界の仮面弁士 さん) に返信
> それでは別の曜日だった場合…たとえば
>  起算日:2022/05/07(土)
>  記録日:2022/05/08(日)
「1」とカウントしたいです。【B案】でいきたいです。
引用返信 編集キー/
■99696 / inTopicNo.4)  Re[3]: 日付計算から週単位に変換する方法
□投稿者/ 魔界の仮面弁士 (3360回)-(2022/05/13(Fri) 19:12:49)
No99695 (河童 さん) に返信
> 【B案】でいきたいです。

たとえばこんな感じでどうでしょう。

private void button1_Click(object sender, EventArgs e)
{
  button1.Text = Date_Week(textBox1.Text, textBox2.Text).ToString();
}

public int Date_Week(DateTime sdate, DateTime edate)
{
  if (sdate > edate) { throw new ArgumentOutOfRangeException(); }
  return ((edate.Date - sdate.Date).Days / 7) + 1;
}
public int Date_Week(string sdate, string edate)
{
  Func<string, DateTime> toDate = s => DateTime.ParseExact(
   s, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
  return Date_Week(toDate(sdate), toDate(edate));
}


---
ParseExact(s, "yyyyMMdd", null) の部分は
ParseExact(s, "yyyyMMdd", InvariantCulture) に差し換えています。

元のコードだと、OS の設定が和暦モードだった場合に
"20220501" が 4040年5月1日(火) に誤読されてしまうので。
引用返信 編集キー/
■99697 / inTopicNo.5)  Re[1]: 日付計算から週単位に変換する方法
□投稿者/ Azulean (1239回)-(2022/05/15(Sun) 08:22:22)
2022/05/15(Sun) 15:21:40 編集(投稿者)

No99693 (河童 さん) に返信
> わからない点は、小数点の切り上げがあったときどのように処理すればいいかです。

念のための補足ですが、C# で「int 型(整数型)」同士での四則演算は整数として処理されます。
このため、8 / 7 = 1, 7 / 7 = 1, 6 / 7 = 0, ..., 1 / 7 = 0, 0 / 7 = 0 となります。


この性質を踏まえ、魔界の仮面弁士さんが示されているように、「整数型で除算した結果に 1 を足す」ことで今回の期待値となります。

// 間違っていたので訂正。
引用返信 編集キー/
■99698 / inTopicNo.6)  Re[2]: 日付計算から週単位に変換する方法
□投稿者/ 河童 (8回)-(2022/05/15(Sun) 08:47:53)
皆様、ご回答ありがとうございました。

希望する値を取得することができました。

最近またプログラミングを始めたので、いろいろ悪戦苦闘しています。
やりたいことができたときは嬉しいです。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -