特定の日付の週番号を確認するにはどうすればよいですか?

私はwpfを使ってカレンダーを作ろうとしています。 itemsPanelなどを使用すると、7列(日曜日 - 土曜日)と6行(週の#月)のグリッドがあります。曜日と週番号(月)を取得して、毎月の最初の開始位置を見つけることができれば、週番号(毎月0〜5)を見つけるにはどうすればいいですか?また、私は何とかそこからカレンダーを記入することはできませんか?私は迷っています。私は他に何を試していいのか分かりません。

public partial class SchedulePage : Page
{        
    MainWindow _parentForm;
    public int dayofweek;

    public SchedulePage(MainWindow parentForm)
    {
        InitializeComponent();
        _parentForm = parentForm;
       //DateTime date = new DateTime(year, month, day);

        _parentForm.bindings = new BindingCamper();          
        _parentForm.bindings.schedule.Add(new Schedule { WeekNo = (int) getWeekNumber(), WeekDay = dayofweek });
        DataContext = _parentForm.bindings;
       //lblTest.Content = dates(2011, 10, 27);
    }

    public double getWeekNumber()
    {
        dayofweek = getWeekDay(2011, 10, 31);
        double h = dayofweek/7;
        double g = Math.Floor(h);
        return g;
    }

    public int getWeekDay(int year, int month, int day)
    {
        //year = 2011;
        //month = 10;
        //day = 27;
        int[] t = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
       //year -= month < 3;
        return (year + year/4 - year/100 + year/400 + t[month - 1] + day) % 7;
    }
12

2 答え

Calendar.GetDayOfWeekCalendar.GetWeekOfYear

任意の日付/時刻処理コードを自分で記述すると、フォールトが含まれ、異なるロケールでは動作しないことを保証できます。

public class Row
{
    public string MonthWeek { get; set; }
    public string Year { get; set; }
    public string Month { get; set; }
    public string Day { get; set; }
    public string WeekOfYear { get; set; }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var l = new List();
        DateTime startDate = DateTime.Now;
        DateTime d = new DateTime(startDate.Year, startDate.Month, 1);
        var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar;
        var ms = cal.GetWeekOfYear(new DateTime(d.Year, d.Month, 1), System.Globalization.CalendarWeekRule.FirstDay, System.DayOfWeek.Sunday);
        for (var i = 1; d.Month == startDate.Month; d = d.AddDays(1))
        {
            var si = new Row();
            var month_week = (d.Day/7) + 1;
            si.MonthWeek = month_week.ToString();
            si.Month = d.Year.ToString();
            si.Year = d.Month.ToString();
            si.Day = d.Day.ToString();
            si.WeekOfYear = cal.GetWeekOfYear(d, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString();
            l.Add(si);
        }
        dataGrid1.ItemsSource = l;
    }
}

XAMLの義務的なDataGridと一緒に:

    
17
追加された
@TMan私はあなたがこれを行う方法の実例を加えました。
追加された 著者 Richard Harrison,
msは月の開始番号です。私は実際には常に月の日と同じになるので、私は使用されていません。
追加された 著者 Richard Harrison,
だから、これは何週に1〜53の日付を返します、どのように私はその情報を取るとb/c私のグリッドは6行grid.row 0-5を持って使用します。無知を申し訳ありません、これは私にとってすべて新しいものです。言い換えれば、coloumnsは週の日と行が何週目かです。私はグリッドにそれをどのように適用し、それをすべて埋めるべきかわかりません
追加された 著者 TMan,
ありがとう、var msと私は何のために使用されている、彼らは何のために使用されることはありません?
追加された 著者 TMan,

これを行うには、グローバリゼーションの Calendar.GetWeekOfYear を使用できます。

Here's the MSDN docs for it: http://msdn.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear.aspx

CultureInfo.CurrentCulture から適切な文化プロパティを GetWeekOfYear に渡して、現在のカルチャを適切に一致させる必要があります。

例:

int GetWeekOfYear(DateTime date)
{
    return Calendar.GetWeekOfYear(
        date,
        CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule,
        CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek
    );
}

これを DateTime の拡張メソッドに簡単に変更することができます:

static int GetWeekOfYear(this DateTime date)
{
    return Calendar.GetWeekOfYear(
        date,
        CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule,
        CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek
    );
}
11
追加された
現在のカルチャに固執するように、 CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek をパラメータに使用する必要があります。これを反映するように更新されました。
追加された 著者 Polynomial,
私はあなたがその方法にどれくらい頼っているかについてあなたに注意を払います - それはあなたに矛盾した結果を与えるでしょう。たとえば、12月30日は日曜日です。そのメソッドをFirstDayまたはFirstFourDayWeekのWeekRuleで呼び出すと、週の最初の曜日として日曜日に53を返します。ただし、同じ週の一部である2013年1月1日の日付でそのメソッドを呼び出すと、 1を得る。
追加された 著者 AndrewS,
@リチャードはい私は彼らがあなたが提供している日付の年を考えていると思うが、あなたはそれをどのように呼び出すかについてまだ注意しなければならない。週番号を表示しているときにOutlookのようなものを見ると、2012年12月30日と31日を含む日付ナビゲータまたは月表示の行に1が表示され、53が返されます。個人的には、 2013年の最初の週の一部となる予定ですが、おそらく1年分のパラミを返す必要があります。
追加された 著者 AndrewS,
System.Globalization.Calendar.GetWeekOfYearは非静的メソッドです。 DateTimeFormatInfo.CurrentInfoのインスタンスは、ここ。私はこれを反映するために答えを更新しました。
追加された 著者 Marco Lackovic,
+1 - しかし、私は "使用する必要があります"と言うより "使用する必要があります" - refを私の答え
追加された 著者 Richard Harrison,
矛盾していない@AndrewS年の開始からの週番号であるので、入力データが正しいと思われます。年の境界を越えて一致する絶対週数はありませんIMHO
追加された 著者 Richard Harrison,
だから、これは何週に1〜53の日付を返します、どのように私はその情報を取るとb/c私のグリッドは6行grid.row 0-5を持って使用します。無知を申し訳ありません、これは私にとってすべて新しいものです。
追加された 著者 TMan,
言い換えれば、coloumnsは週の日と行が何週目かです。私はそれをグリッドにどのように適用し、それをすべて埋めるのかわかりません。
追加された 著者 TMan,