Hoe kan ik het weeknummer van een bepaalde datum bepalen?

Ik probeer een kalender te maken met behulp van wpf. Door itemsPanel en meer te gebruiken, heb ik een raster met 7 kolommen (zondag-zaterdag) en 6 rijen (week # van maand). Als ik de startpositie van de eerste van elke maand kan vinden door het week- en weeknummer (van de maand) te krijgen, hoe kan ik dan het weeknummer vinden (0-5 van elke maand)? Kan ik op de een of andere manier ook niet zomaar de kalender van daaruit invullen? Ik ben verdwaald en ik weet niet wat ik nog meer moet proberen.

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 antwoord

U moet Calendar.GetDayOfWeek en Calendar.GetWeekOfYear in plaats van jezelf te schrijven.

U kunt garanderen dat als u zelf een datum/tijd-verwerkingscode schrijft, deze fouten bevat en niet op verschillende locaties werkt.

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;
    }
}

samen met de verplichte DataGrid in de XAML:

    
17
toegevoegd
@TMan Ik heb een goed voorbeeld toegevoegd van hoe je dit zou kunnen doen;
toegevoegd de auteur Richard Harrison, de bron
ms is het weeknummer van de maandstart. ik wordt niet gebruikt - omdat het in feite altijd hetzelfde zal zijn als de dag van de maand.
toegevoegd de auteur Richard Harrison, de bron
Dus dit zou retourneren welke week die datum is in 1-53, hoe kan ik die info gebruiken en gebruiken, hoewel b/c mijn raster 6 rijen raster heeft. Zet 0-5. Sorry voor de onwetendheid, dit is allemaal nieuw voor mij. Met andere woorden, de colonnes is welke week dag en rij week # is. Ik weet niet hoe ik dat op het rooster moet toepassen en alles moet invullen
toegevoegd de auteur TMan, de bron
bedankt, wat is var ms en waarvoor werd gebruikt, ze worden nooit ergens voor gebruikt?
toegevoegd de auteur TMan, de bron

U kunt Calendar.GetWeekOfYear van Globalization gebruiken om dit te doen.

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

U moet de juiste cultuureigenschappen van CultureInfo.CurrentCulture doorgeven aan GetWeekOfYear zodat u de huidige cultuur op de juiste manier aansluit.

Voorbeeld:

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

U kunt dit gemakkelijk wijzigen in een uitbreidingsmethode op DateTime :

static int GetWeekOfYear(this DateTime date)
{
    return Calendar.GetWeekOfYear(
        date,
        CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule,
        CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek
    );
}
11
toegevoegd
Je moet CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek gebruiken voor de parameter, zodat je je aan de huidige cultuur houdt. Bijgewerkt antwoord om dit te weerspiegelen.
toegevoegd de auteur Polynomial, de bron
Ik zou u waarschuwen voor hoeveel u vertrouwt op die methode - het zal u inconsistente resultaten geven. 30 december 2012 is bijvoorbeeld een zondag. Als u die methode oproept met een WeekRule van FirstDay of FirstFourDayWeek en zondag als eerste dag van de week, retourneert deze 53. Als u echter die methode met een datum van 1 januari 2013 noemt die deel uitmaakt van dezelfde week, zult u krijg 1.
toegevoegd de auteur AndrewS, de bron
@Richard Ja, ik neem aan dat ze het jaar van de datum die je aanbiedt overwegen, maar dan moet je nog steeds voorzichtig zijn met hoe je dit aanroept. Als je kijkt naar iets als Outlook wanneer het weeknummers toont, zou het 1 hebben getoond voor de regel in de datum-navigator of maandweergave die de 30 en 31 december 2012 bevat, terwijl die methode 53 zou zijn teruggekomen. Persoonlijk zou ik die beschouwen dagen om deel uit te maken van de eerste week van 2013, maar dan zouden ze waarschijnlijk een jaar uit param of zo moeten terugkomen.
toegevoegd de auteur AndrewS, de bron
System.Globalization.Calendar.GetWeekOfYear is een niet-statische methode. De instantie onder DateTimeFormatInfo.CurrentInfo kan worden gebruikt zoals wordt weergegeven hier . Ik heb het antwoord bijgewerkt om dit weer te geven.
toegevoegd de auteur Marco Lackovic, de bron
+1 - maar ik zou zeggen "moet gebruiken" in plaats van "kan gebruiken" - ref mijn antwoord
toegevoegd de auteur Richard Harrison, de bron
@AndrewS dat niet lijkt te inconsistent lijkt het goed te zijn gezien de invoergegevens aangezien het het weeknummer is relatief aan het begin van het jaar - er kan geen absoluut weeknummer zijn dat consistent is over de jaargrenzen heen IMHO
toegevoegd de auteur Richard Harrison, de bron
Dus dit zou retourneren welke week die datum is in 1-53, hoe kan ik die info gebruiken en gebruiken, hoewel b/c mijn raster 6 rijen raster heeft. Zet 0-5. Sorry voor de onwetendheid, dit is allemaal nieuw voor mij.
toegevoegd de auteur TMan, de bron
Met andere woorden, de colonnes is welke week dag en rij week # is. Ik weet niet hoe ik dat op het rooster moet toepassen en alles moet invullen.
toegevoegd de auteur TMan, de bron