¿Cómo encuentro el comienzo de la semana (tanto el domingo como el lunes) sabiendo solo la hora actual en C #?
Algo como:
DateTime.Now.StartWeek(Monday);
Utiliza un método de extensión. Son la respuesta a todo, ¿sabes? ;)
public static class DateTimeExtensions
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
return dt.AddDays(-1 * diff).Date;
}
}
Que se puede usar de la siguiente manera:
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
dt
es UTC y ya es el comienzo de la semana, por ejemplo,2012-09-02 16:00:00Z
que esMon, 03 Sep 2012 00:00:00
en hora local. Por lo tanto, debe convertirsedt
a la hora local o hacer algo un poco más inteligente. También necesitaría devolver el resultado como UTC si la entrada fue UTC.DateTime.Parse("2012-09-02 16:00:00Z")
devuelve el equivalente de hora local, y este método devuelve correctamente la misma hora que la hora local. Si usaDateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()
para pasar explícitamente la hora UTC, este método devuelve correctamente 6 días, 16 horas antes, como hora UTC. Funciona exactamente como esperaba.dt
. Yo solíaint diff = dt.Date.DayOfWeek - startOfWeek;
La forma más rápida que puedo encontrar es:
Si desea que cualquier otro día de la semana sea su fecha de inicio, todo lo que necesita hacer es agregar el valor de DayOfWeek al final
fuente
Un poco más detallado y culturalmente consciente:
fuente
CultureInfo.CurrentCulture
lugar de sacarlo del hilo de esa manera. Parece una forma extraña de acceder.Now
propiedad dos veces. Si la hora actual pasa las 24:00 (o las 12:00 de la medianoche) entre las dos llamadas, la fecha habrá cambiado.Usando Fluent DateTime :
fuente
public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
Feo pero al menos devuelve las fechas correctas
Con inicio de semana establecido por sistema:
Sin:
fuente
Combinemos la respuesta segura para la cultura y la respuesta del método de extensión:
fuente
dt
lugar deDateTime.Today
, para envolver las matemáticas en un(offset + 7) % 7
para asegurar un desplazamiento negativo, para usar una sobrecarga del método de un solo parámetro que pasa la cultura actualFirstDayOfWeek
comostartOfWeek
argumento, y posiblemente (dependiendo de la especificación) para forzar un compensación de cero a una compensación de 7 días, de modo que "el martes pasado" no regrese hoy si ya es martes.Esto te daría el domingo anterior (creo):
fuente
Esto puede ser un poco pirateo, pero puede convertir la propiedad .DayOfWeek a un int (es una enumeración y, dado que no ha cambiado su tipo de datos subyacente, el valor predeterminado es int) y usarlo para determinar el comienzo de la semana anterior .
Parece que la semana especificada en la enumeración DayOfWeek comienza el domingo, por lo que si restamos 1 de este valor, será igual a cuántos días es el lunes antes de la fecha actual. También necesitamos mapear el domingo (0) para igualar 7, por lo tanto, dado 1 - 7 = -6, el domingo se mapeará al lunes anterior: -
El código del domingo anterior es más simple ya que no tenemos que hacer este ajuste: -
fuente
Para el lunes
Para el domingo
fuente
fuente
Poniendo todo junto, con Globalización y permitiendo especificar el primer día de la semana como parte de la llamada que tenemos
fuente
fuente
Esto te daría medianoche el primer domingo de la semana:
Esto te da el primer lunes a medianoche:
fuente
intente con esto en c #. Con este código puede obtener la primera fecha y la última fecha de una semana determinada. Aquí el domingo es el primer día y el sábado es el último día, pero puede configurar ambos días de acuerdo con su cultura
fuente
Intenté varios, pero no resolví el problema con una semana que comenzó un lunes, lo que me dio el próximo lunes un domingo. Así que lo modifiqué un poco y lo hice funcionar con este código:
fuente
dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Paso 1: crea una clase estática
Paso 2: use esta clase para obtener el día de inicio y finalización de la semana
fuente
(6 - (dt.DayOfWeek - startOfWeek)) % 7
para mí contra las pruebas unitarias que escribí.El siguiente método debería devolver el DateTime que desea. Pase verdadero para el domingo siendo el primer día de la semana, falso para el lunes:
fuente
Gracias por los ejemplos. Siempre necesitaba usar el "CurrentCulture" el primer día de la semana y para una matriz necesitaba saber el número de día exacto ... así que aquí están mis primeras extensiones:
fuente
Nadie parece haber respondido esto correctamente todavía. Pegaré mi solución aquí en caso de que alguien la necesite. El siguiente código funciona independientemente de si el primer día de la semana es un lunes o un domingo u otra cosa.
fuente
El módulo en C # funciona mal para -1mod7 (debería ser 6, c # devuelve -1) así que ... la solución "oneliner" se verá así :)
fuente
Lo mismo para el final de la semana (al estilo de @Compile).
fuente
Podrías usar la excelente biblioteca Umbrella :
Sin embargo, no parecen haber almacenado el lunes como el primer día de la semana (ver la propiedad
nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn
), por lo que la solución localizada anterior es un poco mejor. Desgraciado.Editar : mirando más de cerca la pregunta, parece que Umbrella podría funcionar para eso también:
Aunque vale la pena señalar que si solicita el lunes anterior un lunes, le devolverá siete días. Pero esto también es cierto si lo usa
BeginningOfWeek
, lo que parece un error :(.fuente
Esto devolverá las fechas de inicio y fin de semana:
He publicado el código completo para calcular el inicio / fin de semana, mes, trimestre y año en mi blog ZamirsBlog
fuente
fuente
Aquí hay una combinación de algunas de las respuestas. Utiliza un método de extensión que permite pasar la cultura, si no se pasa una, se usa la cultura actual. Esto le dará la máxima flexibilidad y reutilización.
Ejemplo de uso:
fuente
si quiere el sábado o el domingo o cualquier día de la semana pero que no exceda la semana actual (sábado a domingo), lo cubro con este código.
fuente
Nos gustan las frases sencillas: obtenga la diferencia entre el primer día de la semana de la cultura actual y el día actual, luego reste la cantidad de días del día actual
fuente
Siguiendo de Compile This 'Answer, use el siguiente método para obtener la fecha de cualquier día de la semana:
fuente
Intenta crear una función que utilice la recursividad. Su objeto DateTime es una entrada y la función devuelve un nuevo objeto DateTime que representa el comienzo de la semana.
fuente
Calcular de esta manera le permite elegir qué día de la semana indica el comienzo de una nueva semana (en el ejemplo que elegí el lunes).
Tenga en cuenta que hacer este cálculo para un día que es lunes dará el lunes actual y no el anterior.
fuente