web-dev-qa-db-ja.com

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

Wpfを使用してカレンダーを作成しようとしています。 itemsPanelなどを使用することで、7列(日曜日から土曜日)と6行(月の週番号)のグリッドができました。 (月の)曜日と週番号を取得して毎月1の開始位置を見つけることができる場合、週番号(各月の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
TMan

自分で書くよりも、 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<Row>();
        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と一緒に:

    <DataGrid AutoGenerateColumns="true" Name="dataGrid1" />
17

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

そのためのMSDNドキュメントは次のとおりです。 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
Polynomial

@Polynomialの回答では、次のエラーが発生します。

非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です。

以前にGregorianCalendarをインスタンス化した場合は、メソッドGetWeekOfYearを呼び出すことができます。

private static int GetWeekNumber(DateTime time)
{
    GregorianCalendar cal = new GregorianCalendar();
    int week = cal.GetWeekOfYear(time, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday);
    return week;
}
0
A. Morel