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

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

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

Re[5]: 週番号から日付を取得


(過去ログ 96 を表示中)

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

■57546 / inTopicNo.1)  週番号から日付を取得
  
□投稿者/ ちか (8回)-(2011/03/03(Thu) 17:25:37)

分類:[C#] 

週番号を入れてその週の月曜日日付を取得したいと思っています。


下記は日付から週番号を取得できたのですが、、、
      Calendar cal = CultureInfo.CurrentCulture.Calendar;
CalendarWeekRule cwr = CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule;
DayOfWeek firstDay = DayOfWeek.Monday;

DateTime dDay = new DateTime();
dDay = System.DateTime.Now;
int weekNumber = cal.GetWeekOfYear(dDay, cwr, firstDay);
if (weekNumber == 0)
{
dDay = System.DateTime.Now;
}

週番号から日付を取る方法をご教授ください。
引用返信 編集キー/
■57547 / inTopicNo.2)  Re[1]: 週番号から日付を取得
□投稿者/ shu (494回)-(2011/03/03(Thu) 17:43:32)
No57546 (ちか さん) に返信

DateTime dtToday = DateTime.Today;
DateTime dtWeekFirst = dtToday.AddDays(-(int)dtToday.DayOfWeek);
DateTime dtMonday = dtWeekFirst.AddDays((int)DayOfWeek.Monday);

こんなんでどうでしょう?
引用返信 編集キー/
■57623 / inTopicNo.3)  Re[2]: 週番号から日付を取得
□投稿者/ ちか (9回)-(2011/03/07(Mon) 12:03:59)
No57547 (shu さん) に返信
> ■No57546 (ちか さん) に返信
>
> DateTime dtToday = DateTime.Today;
> DateTime dtWeekFirst = dtToday.AddDays(-(int)dtToday.DayOfWeek);
> DateTime dtMonday = dtWeekFirst.AddDays((int)DayOfWeek.Monday);
>
> こんなんでどうでしょう?

Shuさんありがとうございます。
  
   int iWeek = 1; //月の週番号指定

Calendar cal = CultureInfo.CurrentCulture.Calendar;
CalendarWeekRule cwr = CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule;
DayOfWeek firstDay = DayOfWeek.Sunday;

DateTime DateMonthS = new DateTime();
DateMonthS = DateTime.Parse(”対象年月の1日”); // ”2011/03/01”
int weekNumberS = cal.GetWeekOfYear(DateMonthS, cwr, firstDay);
if (weekNumberS == 0)
{
DateMonthS = System.DateTime.Now;
}

DateTime DateMonthE = new DateTime();
DateMonthE = new DateTime(DateMonthS.Year, DateMonthS.Month, DateTime.DaysInMonth(DateMonthS.Year, DateMonthS.Month));
int weekNumberE = cal.GetWeekOfYear(DateMonthE, cwr, firstDay);

int MonthWeek = weekNumberE - weekNumberS + 1;

if (iWeek < 1 && MonthWeek < iWeek) 
{
//週番号が範囲外の場合エラーメッセージ
break;
}

int weekNumber = (iWeek - 1); // 年からの週番号

週番号から対象の週の最初の日付を取るには、、、、
      どうしたらよいでしょうか?
引用返信 編集キー/
■57627 / inTopicNo.4)  Re[3]: 週番号から日付を取得
□投稿者/ shu (498回)-(2011/03/07(Mon) 12:10:43)
2011/03/07(Mon) 12:12:21 編集(投稿者)
2011/03/07(Mon) 12:11:30 編集(投稿者)

No57623 (ちか さん) に返信

1/1を週番号1の週とすればいいのかな?
前記ロジックで1/1の週の月曜を求め、(ここで去年になってしまったら次の月曜が週番号1?)
AddDays(7*(週番号-1))でどうでしょう?

引用返信 編集キー/
■57633 / inTopicNo.5)  Re[4]: 週番号から日付を取得
□投稿者/ ちか (10回)-(2011/03/07(Mon) 13:36:33)
shuさん
  ありがとうございます。
  解決いたしました。

DateTime dtYearFirst = DateMonthS.AddDays(-(int)DateMonthS.DayOfWeek);
DateTime dtSunday = dtYearFirst.AddDays((int)DayOfWeek.Sunday);

DateTime WeekS = new DateTime();
WeekS = dtSunday.AddDays(7 * (iWeek - 1));

lblWeek.Text = WeekS.ToString() + "〜" + WeekS.AddDays(6).ToString();



No57627 (shu さん) に返信
> 2011/03/07(Mon) 12:12:21 編集(投稿者)
> 2011/03/07(Mon) 12:11:30 編集(投稿者)
>
> ■No57623 (ちか さん) に返信
>
> 1/1を週番号1の週とすればいいのかな?
> 前記ロジックで1/1の週の月曜を求め、(ここで去年になってしまったら次の月曜が週番号1?)
> AddDays(7*(週番号-1))でどうでしょう?
>
解決済み
引用返信 編集キー/
■57634 / inTopicNo.6)  Re[4]: 週番号から日付を取得
□投稿者/ 魔界の仮面弁士 (2122回)-(2011/03/07(Mon) 13:37:37)
2011/03/07(Mon) 13:49:36 編集(投稿者)

# 投稿直前に解決済みになったようなので、「解決済み」に直して再投稿。

No57627 (shu さん) に返信
> 1/1を週番号1の週とすればいいのかな?

とは限らなかったりします。

週番号の数え方は何パターンかあり、それを指定しているのが、
GetWeekOfYear メソッドに渡された『CalendarWeekRule』です。
提示されたコードは CurrentCulture を使っているので、1月1日基準であるとは限りません。

# 同種のパラメータとして、VB.NET の FirstWeekOfYear 列挙型や
# VBA の VbFirstWeekOfYear 列挙型などがあります。

ちなみに週番号の国際標準は ISO8601:2000 です。
(その翻訳版が、JIS X 0301:2002 として定義されています)

ISO8601 における週番号 1 とは、「1月4日が含まれる週」を表します。
ISO8601 における一週間は月曜始まりですので、これは別の言い方をすれば、
「1月の最初の木曜日が含まれる週」であるとも言えます。一週は必ず7日であり、
12月31日が第1週に含まれる事もあれば、1月1日が第52週や53週となる事もあります。

もちろん、shu さんが書かれたように「1月1日」から第1週を始める実装もあります。
有名どころでは Excel の WEEKNUM 関数ですね。
(こちらのパターンでは、第一週が 7 日未満となる可能性があります)


なのでGetWeekOfYear メソッドの逆実装を真面目に作りこもうとするならば、年と週番号だけではなく
CalendarWeekRule(FirstDay / FirstFullWeek / FirstFourDayWeek) および開始曜日も判断した上で
処理する必要があります。もっとも、通常の運用では単一ルールで実装すれば十分でしょうけれども。
解決済み
引用返信 編集キー/
■57660 / inTopicNo.7)  Re[5]: 週番号から日付を取得
□投稿者/ shu (502回)-(2011/03/07(Mon) 22:52:07)
なるほど、週番号というのはISOで決められているほどのものだったのですね。
1月4日というのは週の半分位は年内に入っていた方がいいという事なのでしょうかね。


ところで、再度提示されたコードを見たところ
>DateMonthE = new DateTime(DateMonthS.Year, DateMonthS.Month, DateTime.DaysInMonth(DateMonthS.Year, DateMonthS.Month));
と書いてますが、私は
DateMonthE = new DateTime(DateMonthS.Year, DateMonthS.Month, 1).AddMonths(1).AddDays(-1)
さらには
DateMonthE = DateMonthS.AddDays(1-DateMonthS.day).AddMonths(1).AddDays(-1)
※DateMonthSが1日なのでDateMonthE = DateMonthS.AddMonths(1).AddDays(-1) とも書ける。
と書いたりします。参考まで。(これが正しいというわけではありません)

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -