Como localizo o início da semana (domingo e segunda-feira) sabendo exatamente o horário atual em c #?
Algo como:
DateTime.Now.StartWeek(Monday);
Use um método de extensão. Eles são a resposta para tudo, você sabe! ;)
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 pode ser usado da seguinte maneira:
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
for UTC e já é o início da semana, por exemplo,2012-09-02 16:00:00Z
que estáMon, 03 Sep 2012 00:00:00
no horário local. Portanto, ele precisa converterdt
para a hora local ou fazer algo um pouco mais inteligente. Também seria necessário retornar o resultado como UTC se a entrada fosse UTC.DateTime.Parse("2012-09-02 16:00:00Z")
retorna o equivalente à hora local e esse método retorna corretamente a mesma hora, como uma hora local. Se você usarDateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()
para passar explicitamente o horário UTC, esse método retornará corretamente 6 dias, 16 horas antes, como horário UTC. Está funcionando exatamente como eu esperava.dt
. Eu useiint diff = dt.Date.DayOfWeek - startOfWeek;
A maneira mais rápida de criar é:
Se você deseja que qualquer outro dia da semana seja sua data de início, tudo o que você precisa fazer é adicionar o valor DayOfWeek ao final
fonte
Um pouco mais detalhado e consciente da cultura:
fonte
CultureInfo.CurrentCulture
vez de retirá-la da discussão dessa maneira. Parece uma maneira estranha de acessá-lo.Now
propriedade duas vezes. Se a hora atual passar das 24:00 (ou 12:00 da meia-noite) entre as duas chamadas, a data será alterada.Usando Fluente DateTime :
fonte
public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
Feio, mas pelo menos dá as datas certas
Com o início da semana definido pelo sistema:
Sem:
fonte
Vamos combinar a resposta de segurança da cultura e a resposta do método de extensão:
fonte
dt
vez deDateTime.Today
, para envolver a matemática em(offset + 7) % 7
para garantir um deslocamento negativo, para usar uma sobrecarga de método de parâmetro único que passa a cultura atualFirstDayOfWeek
comostartOfWeek
argumento e, possivelmente (dependendo da especificação), para coagir um deslocamento de zero para deslocamento de 7 dias, para que a "última terça-feira" não retorne hoje se já for terça-feira.Isso daria a você no domingo anterior (eu acho):
fonte
Isso pode ser um pouco complicado, mas você pode converter a propriedade .DayOfWeek em um int (é uma enumeração e, como o tipo de dados subjacente não foi alterado, o padrão é int) e pode ser usado para determinar o início da semana anterior .
Parece que a semana especificada na enumeração DayOfWeek começa no domingo; portanto, se subtrairmos 1 desse valor, será igual a quantos dias a segunda-feira é anterior à data atual. Também precisamos mapear o domingo (0) para ser igual a 7, portanto, dado 1 - 7 = -6, o domingo será mapeado para a segunda-feira anterior: -
O código do domingo anterior é mais simples, pois não precisamos fazer esse ajuste: -
fonte
Para segunda-feira
Para domingo
fonte
fonte
Juntando tudo, com a Globalização e permitindo especificar o primeiro dia da semana como parte da chamada que realizamos
fonte
fonte
Isso lhe daria meia-noite no primeiro domingo da semana:
Isso fornece a primeira segunda-feira à meia-noite:
fonte
tente com isso em c #. Com esse código, você pode obter a primeira data e a última data de uma determinada semana. Aqui o domingo é o primeiro dia e o sábado é o último dia, mas você pode definir os dois dias de acordo com sua cultura
fonte
Tentei várias, mas não resolvi o problema com uma semana a partir de segunda-feira, resultando em uma segunda-feira que chegaria no domingo. Então eu modifiquei um pouco e consegui trabalhar com este código:
fonte
dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Etapa 1: criar uma classe estática
Etapa 2: use esta classe para obter o dia da semana de início e de término
fonte
(6 - (dt.DayOfWeek - startOfWeek)) % 7
para mim contra os testes de unidade que escrevi.O método a seguir deve retornar o DateTime que você deseja. Passe verdadeiro para domingo, sendo o primeiro dia da semana, falso para segunda-feira:
fonte
Obrigado pelos exemplos. Eu precisava sempre usar o "CurrentCulture" no primeiro dia da semana e, para uma matriz, eu precisava saber o número do dia exato. Então, aqui estão minhas primeiras extensões:
fonte
Parece que ninguém respondeu isso corretamente ainda. Vou colar minha solução aqui, caso alguém precise. O código a seguir funciona independentemente se o primeiro dia da semana for uma segunda-feira ou domingo ou outra coisa.
fonte
O módulo em C # funciona mal para -1mod7 (deve ser 6, c # retorna -1), então ... a solução "oneliner" para isso ficará assim :)
fonte
O mesmo para o final de semana (no estilo da resposta do @Compile Isto):
fonte
Você pode usar a excelente biblioteca Umbrella :
No entanto, eles não parecem ter armazenado segunda-feira como o primeiro dia da semana (veja a propriedade
nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn
), para que a solução localizada anterior é um pouco melhor. Infeliz.Edit : olhando mais de perto a questão, parece que a Umbrella também pode funcionar para isso:
Embora valha a pena notar que, se você pedir a segunda-feira anterior em uma segunda-feira, isso lhe dará sete dias de volta. Mas isso também é verdade se você usar
BeginningOfWeek
, o que parece um bug :(.fonte
Isso retornará as datas do início da semana e do final da semana:
Publiquei o código completo para calcular o início / fim de semana, mês, trimestre e ano no meu blog ZamirsBlog
fonte
fonte
Aqui está uma combinação de algumas das respostas. Ele usa um método de extensão que permite que a cultura seja transmitida, se não for transmitida, a cultura atual é usada. Isso lhe dará flexibilidade e reutilização máximas.
Exemplo de uso:
fonte
se você quiser sábado ou domingo ou qualquer dia da semana, mas não exceder a semana atual (sábado a domingo), cobri-o com este código.
fonte
Gostamos de uma linha: obtenha a diferença entre o primeiro dia da semana da cultura atual e o dia atual e subtraia o número de dias do dia atual
fonte
Na sequência de Compilar esta 'resposta, use o seguinte método para obter a data para qualquer dia da semana:
fonte
Tente criar uma função que use recursão. Seu objeto DateTime é uma entrada e a função retorna um novo objeto DateTime, que representa o início da semana.
fonte
O cálculo dessa maneira permite escolher qual dia da semana indica o início de uma nova semana (no exemplo que escolhi segunda-feira).
Observe que fazer esse cálculo para um dia que seja segunda-feira fornecerá a segunda-feira atual e não a anterior.
fonte