2008-08-13 16 views
7

Actualmente estoy escribiendo un pequeño calendario en ASP.Net C#. Actualmente para producir las filas de las semanas hago lo siguiente bucle:Calcular Semanas de Fecha y Hora en Filas

var iWeeks = 6; 
for (int w = 0; w < iWeeks; w++) { 

Esto funciona bien, sin embargo, algunos meses será sólo tienen 5 semanas y en algunos casos raros, 4.

¿Cómo puedo calcular el número de filas que se requerirán para un mes en particular?

Este es un ejemplo de lo que estoy creando:

enter image description here

Como se puede ver en el mes anterior, sólo hay 5 filas requeridas, sin embargo. Tome este mes (agosto de 2008) que comenzó un sábado y termina un lunes en la sexta semana/fila.

imagen encontrada en Google


Este es un ejemplo de lo que estoy creando:

enter image description here

Como se puede ver en el mes anterior, sólo hay 5 filas requeridas, sin embargo. Tome este mes (agosto de 2008) que comenzó un sábado y termina un lunes en la sexta semana/fila.

imagen encontrada en Google

Respuesta

6

Aquí es el método que lo hace:

public int GetWeekRows(int year, int month) 
{ 
    DateTime firstDayOfMonth = new DateTime(year, month, 1); 
    DateTime lastDayOfMonth = new DateTime(year, month, 1).AddMonths(1).AddDays(-1); 
    System.Globalization.Calendar calendar = System.Threading.Thread.CurrentThread.CurrentCulture.Calendar; 
    int lastWeek = calendar.GetWeekOfYear(lastDayOfMonth, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    int firstWeek = calendar.GetWeekOfYear(firstDayOfMonth, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    return lastWeek - firstWeek + 1; 
} 

Puede personalizar la regla semana del calendario mediante la modificación de la parte System.Globalization.CalendarWeekRule.FirstFourDayWeek. Espero que el código sea auto explicativo.

0

¿Qué hay de comprobación de que la semana el primer y último día estarán en?

0

Los meses en el calendario juliano/gregoriano tienen el mismo número de días cada año, excepto febrero, que puede tener 28 o 29 días dependiendo de la altura del año. Puede encontrar el número de días en la sección Descripción en http://en.wikipedia.org/wiki/Gregorian_calendar.

Como @darkdog mencionó que tiene DateTime.DaysInMonth. Sólo hacer esto:

var days = DateTime.DaysInMonth(year, month) + 
      WhatDayOfWeekTheMonthStarts(year, month);  
int rows = (days/7); 
if (0 < days % 7) 
{ 
    ++rows; 
} 

tomar en consideración el hecho de que para fines de la globalización/localización, algunas partes del mundo utilizan diferentes calendarios/métodos de organización del año.

0

Prueba de esto,

DateTime.DaysInMonth 
2

Bueno, depende de la cultura que está utilizando, pero vamos a suponer que usted puede utilizar Thread.CurrentThread.CurrentCulture, entonces el código para obtener la semana de hoy sería:

Culture culture = Thread.CurrentThread.CurrentCulture; 
Calendar cal = culture.Calendar; 
Int32 week = cal.GetWeekOfYear(DateTime.Today, 
    culture.DateTimeFormat.CalendarWeekRule, 
    culture.DateTimeFormat.FirstDayOfWeek); 
0

Verificar Calendar.GetWeekOfYear. Debería hacer el truco.

Hay un problema con esto, no sigue la regla de 4 días de ISO 8601, pero de lo contrario es limpio.

0

puede obtener los días de un mes utilizando DateTime.DaysInMonth (int WhichYear, int WhichMonth);

0

El problema no es el número de días en el mes, sino la cantidad de semanas que abarca.

Febrero en un año no bisiesto tendrá 28 días, y si el primer día del mes es un lunes, febrero abarcará exactamente números de 4 semanas.

Sin embargo, si el primer día del mes es un martes o cualquier otro día de la semana, febrero abarcará números de 5 semanas.

Un mes de 31 días puede abarcar 5 o 6 semanas de la misma manera. Si el mes comienza un lunes, los 31 días le dan números de 5 semanas. Si el mes comienza el sábado o el domingo, tendrá una duración de 6 números semanales.

Así que la forma correcta de obtener este número es encontrar el número de semana del primer y último día del mes.


Edición # 1: He aquí cómo calcular el número de semanas al mes determinado palmos: editar # 2: Solución de errores en el código

public static Int32 GetWeekForDateCurrentCulture(DateTime dt) 
{ 
    CultureInfo culture = Thread.CurrentThread.CurrentCulture; 
    Calendar cal = culture.Calendar; 
    return cal.GetWeekOfYear(dt, 
     culture.DateTimeFormat.CalendarWeekRule, 
     culture.DateTimeFormat.FirstDayOfWeek); 
} 

public static Int32 GetWeekSpanCountForMonth(DateTime dt) 
{ 
    DateTime firstDayInMonth = new DateTime(dt.Year, dt.Month, 1); 
    DateTime lastDayInMonth = firstDayInMonth.AddMonths(1).AddDays(-1); 
    return 
     GetWeekForDateCurrentCulture(lastDayInMonth) 
     - GetWeekForDateCurrentCulture(firstDayInMonth) 
     + 1; 
} 
0

Primera Averiguar qué día de la semana del primer día del mes. Recién actualizado con el primer día, siempre 1, y el año y mes en cuestión, hay un día de propiedad de la semana en él.

Luego, desde aquí, puede usar la cantidad de días del mes, DateTime.DaysInMonth, para determinar cuántas semanas se divide por siete y luego agregar el número de días a partir de 1 en que cae su primer día. Por ejemplo,

public static int RowsForMonth(int month, int year) 
{ 
    DateTime first = new DateTime(year, month, 1); 

    //number of days pushed beyond monday this one sits 
    int offset = ((int)first.DayOfWeek) - 1; 

    int actualdays = DateTime.DaysInMonth(month, year) + offset; 

    decimal rows = (actualdays/7); 
    if ((rows - ((int)rows)) > .1) 
    { 
     rows++; 
    } 
    return rows; 
} 
Cuestiones relacionadas