Alguém sabe uma maneira fácil de obter a data do primeiro dia da semana (segunda-feira aqui na Europa). Eu sei o ano e o número da semana? Eu vou fazer isso em c #.
c#
.net
week-number
Bobby
fonte
fonte
Respostas:
Eu tive problemas com a solução de @HenkHolterman, mesmo com a correção de @RobinAndersson.
A leitura da norma ISO 8601 resolve bem o problema. Use a primeira quinta-feira como alvo e não segunda-feira. O código abaixo também funcionará para a Semana 53 de 2009.
fonte
Eu gosto da solução fornecida por Henk Holterman. Mas, para ser um pouco mais independente da cultura, você precisa obter o primeiro dia da semana para a cultura atual (nem sempre é segunda-feira):
fonte
firstMonday
é um nome de variável inválido para algo que pode não ser uma segunda-feira. =)ATUALIZAR : O .NET Core 3.0 e o .NET Standard 2.1 foram fornecidos com esse tipo.
Boas notícias! Uma solicitação pull adicionando
System.Globalization.ISOWeek
ao .NET Core foi mesclada e está programada para a versão 3.0. Espero que ele se propague para as outras plataformas .NET em um futuro não muito distante.Você deve poder usar o
ISOWeek.ToDateTime(int year, int week, DayOfWeek dayOfWeek)
método para calcular isso.Você pode encontrar o código fonte aqui .
fonte
A maneira mais fácil é provavelmente encontrar a primeira segunda-feira do ano e adicionar o número relevante de semanas. Aqui está um código de exemplo. Ele assume um número de semana começando em 1, a propósito:
fonte
Pessoalmente, eu aproveitaria as informações da cultura para obter o dia da semana e passar para o primeiro dia da semana da cultura. Não tenho certeza se estou explicando corretamente, aqui está um exemplo:
fonte
usando o Fluent DateTime http://fluentdatetime.codeplex.com/
fonte
De acordo com a ISO 8601: 1988, usada na Suécia, a primeira semana do ano é a primeira semana que tem pelo menos quatro dias no ano novo.
Portanto, se sua semana começa em uma segunda-feira, a primeira quinta-feira de cada ano é dentro da primeira semana. Você pode DateAdd ou DateDiff a partir disso.
fonte
Supondo que o número da semana comece em 1
Isso deve lhe dar o primeiro dia em qualquer semana. Não testei muito, mas parece que funciona. É uma solução menor do que a maioria das outras que encontrei na Web, então queria compartilhar.
fonte
new DateTime(1,1,YearNumber)
A Biblioteca de Período de Tempo gratuita para .NET inclui a semana de classe de conformidade ISO 8601 :
fonte
Este funcionou para mim, também tem a vantagem de esperar uma informação de cultura como parâmetro para testar a fórmula com diferentes culturas. Se vazio, ele obtém as informações atuais da cultura ... os valores válidos são: "it", "en-us", "fr", ... e assim por diante. O truque é subtrair o número da semana do primeiro dia do ano, que pode ser 1 para indicar que o primeiro dia está dentro da primeira semana. Espero que isto ajude.
fonte
Aqui está um método que é compatível com os números das semanas do Google Analytics e também com o mesmo esquema de numeração que usamos internamente na Intel, e que, com certeza, também é usado em muitos outros contextos.
fonte
Eu tentei alguns códigos acima e alguns têm pequenos erros, quando você tenta anos diferentes com diferentes dias da semana, você os vê, eu peguei o código de Jon Skeet, consertei e funcionou, código muito simples.
fonte
Mudou levemente o código de Mikael Svenson. Encontrei a semana da primeira segunda-feira e alterei adequadamente o número da semana.
fonte
A semana 1 é definida como a semana que começa na segunda-feira e contém a primeira quinta-feira do ano.
fonte
Para converter nas duas direções, consulte aqui: Artigo da Wikipedia sobre datas da semana ISO
fonte
Melhorei um pouco a solução de Thomas com uma substituição:
Caso contrário, a data era anterior a uma semana.
Obrigado Thomas, grande ajuda.
fonte
Usei uma das soluções, mas ela me deu resultados errados, simplesmente porque conta o domingo como o primeiro dia da semana.
Eu mudei:
para:
e agora está funcionando como um encanto.
fonte
A solução proposta não está completa - ela funciona apenas para CalendarWeekRule.FirstFullWeek. Outros tipos de regras da semana não funcionam. Isso pode ser visto usando este caso de teste:
fonte
Fiz uma versão refinada da solução proposta que é mais simples e parametriza o firstDayOfWeek:
fonte
esta é a minha solução quando queremos calcular uma data, ano, número da semana e dia da semana.
fonte
Simplifiquei o código que Mikael Svensson forneceu, o que é correto para muitos países da Europa.
fonte
Eu escrevi e testei o código a seguir e está funcionando perfeitamente para mim. Informe-me se alguém tiver problemas com isso. Também postei uma pergunta para obter a melhor resposta possível. Alguém pode achar útil.
fonte
GetFirstDateOfWeekByWeekNumber(2020, 29)
para a semana 29 de 2020, isso retorna07/20/2020
. Mas o primeiro dia da 29ª semana foi07/13/2020
Atualmente, não há classe C # que lide corretamente com os números ISO 8601 semanas. Mesmo que você possa instanciar uma cultura, procurar a coisa mais próxima e corrigi-la, acho melhor fazer o cálculo completo:
fonte