Pesquisei bastante no Google e encontrei muitas soluções, mas nenhuma delas me deu o número de semana correto para o 31/12/2012. Até o exemplo no MSDN ( link ) falha.
31/12/2012 é segunda-feira, portanto deve ser a Semana 1, mas todos os métodos que tentei me deram 53. Aqui estão alguns dos métodos que tentei:
Na biblioteca MDSN:
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;
return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
Solução 2:
return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Solução 3:
CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;
Atualizar
O método a seguir retorna 1 quando a data é 31/12/2012. Em outras palavras, meu problema era que meus métodos não estavam seguindo o padrão ISO-8601.
// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
// Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll
// be the same week# as whatever Thursday, Friday or Saturday are,
// and we always get those right
DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
{
time = time.AddDays(3);
}
// Return the week of our adjusted day
return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
Respostas:
Conforme observado nesta página do MSDN, há uma pequena diferença entre a ISO8601 e a numeração da semana .Net.
Você pode consultar este artigo no Blog do MSDN para obter uma explicação melhor: " Formato da semana do ano ISO 8601 no Microsoft .Net "
Simplificando, o .Net permite que as semanas sejam divididas por anos, enquanto o padrão ISO não. No artigo, há também uma função simples para obter o número de semana ISO 8601 correto para a última semana do ano.
Atualização O método a seguir realmente retorna 1 para o
2012-12-31
que está correto na ISO 8601 (por exemplo, Alemanha).fonte
Pode haver mais de 52 semanas em um ano. Cada ano tem 52 semanas completas + 1 ou +2 (ano bissexto) dias extras. Eles compensam a 53ª semana.
Portanto, para cada ano você tem pelo menos um por dia extra. Dois por anos bissextos. Esses dias extras são contados como semanas separadas?
Quantas semanas existem realmente depende do dia de início da sua semana. Vamos considerar isso para 2012.
Verifique as configurações da sua cultura atual para ver o que ela usa como o primeiro dia da semana.
Como você vê, é normal obter 53 como resultado.
É até possível ter uma 54ª semana. Acontece a cada 28 anos, quando 1 de janeiro e 31 de dezembro são tratados como semanas separadas. Também deve ser um ano bissexto.
Por exemplo, o ano de 2000 teve 54 semanas. 1º de janeiro (sábado) foi o primeiro dia da semana e 31 de dezembro (sol) foi o segundo dia da semana.
Imprime: Ano: 2012 Semana: 54
Altere CalendarWeekRule no exemplo acima para FirstFullWeek ou FirstFourDayWeek e você receberá 53. Vamos manter o dia de início na segunda-feira, pois estamos lidando com a Alemanha.
Assim, a semana 53 começa na segunda-feira 2012-12-31, dura um dia e depois para.
53 é a resposta correta. Mude a cultura para alemanha, se quiser tentar.
fonte
Este é o caminho:
O mais importante para é o
CalendarWeekRule
parâmetroConsulte aqui: https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=IT-IT&k=k(System.Globalization.CalendarWeekRule);k(TargetFrameworkMoniker-.NETFramework
fonte
Boas notícias! A solicitação de recebimento adicionando
System.Globalization.ISOWeek
para .NET Núcleo foi apenas fundiram e está previsto para a versão 3.0. Espero que ele se propague para as outras plataformas .NET em um futuro não muito distante.O tipo tem a seguinte assinatura, que deve cobrir a maioria das necessidades da semana ISO :
Você pode encontrar o código fonte aqui .
ATUALIZAÇÃO : essas APIs também foram incluídas na versão 2.1 do .NET Standard .
fonte
Como não parece haver uma cultura .Net que produz o número de semana ISO-8601 correto, prefiro ignorar completamente a determinação da semana interna e fazer o cálculo manualmente, em vez de tentar corrigir uma correção parcialmente correta. resultado.
Acabei com o seguinte método de extensão:
Primeiro,
((int)date.DayOfWeek + 6) % 7)
determina o número do dia da semana, 0 = segunda-feira, 6 = domingo.date.AddDays(-((int)date.DayOfWeek + 6) % 7)
determina a data da segunda-feira antes do número da semana solicitado.Três dias depois é a meta na quinta-feira, que determina em que ano a semana está.
Se você dividir o número do dia (com base em zero) no ano por sete (arredondar para baixo), obterá o número da semana (com base em zero) no ano.
Em c #, os resultados do cálculo inteiro são arredondados para baixo implicitamente.
fonte
Ticks
é o número de incrementos de 100 nanossegundos desde 1º de janeiro de 0001. Dado que existem 86.400 segundos em um dia, podemos escrever:var thursday = date.AddDays(3 - date.Ticks / 86400 / 10_000_000 % 7); return (thursday.DayOfYear - 1) / 7 + 1;
No .NET 3.0 e posterior, você pode usar o
ISOWeek.GetWeekOfDate
-Method .Observe que o ano no formato de número ano + semana pode ser diferente do ano
DateTime
devido às semanas que cruzam o limite do ano.fonte
C # para a porta do PowerShell do código acima de il_guru :
fonte
A maneira mais fácil de determinar o estilo ISO 8601 do número da semana usando c # e a classe DateTime.
Pergunte o seguinte: a quinta-feira do ano é a quinta-feira desta semana. A resposta é igual ao número da semana desejado.
fonte
Funciona bem para as culturas dos EUA e da Rússia. A ISO 8601 também estará correta, porque a semana russa começa na segunda-feira.
fonte
Aqui está uma versão de extensão e uma versão anulável da resposta de il_guru .
Extensão:
Anulável:
Usos:
fonte
A pergunta é: como você define se uma semana é em 2012 ou em 2013? Sua suposição, eu acho, é que, como 6 dias da semana são em 2013, essa semana deve ser marcada como a primeira semana de 2013.
Não tenho certeza se este é o caminho certo a seguir. A semana começou em 2012 (segunda-feira, 31 de dezembro), portanto deve ser marcada como a última semana de 2012, portanto deve ser a 53ª de 2012. A primeira semana de 2013 deve começar na segunda-feira, dia 7.
Agora, você pode lidar com o caso específico de semanas de ponta (primeira e última semana do ano) usando as informações do dia da semana. Tudo depende da sua lógica.
fonte
fonte
Com base na resposta de il_guru, criei esta versão para minhas próprias necessidades, que também retorna o componente do ano.
fonte
Esses dois métodos ajudarão, supondo que nossa semana comece na segunda-feira
fonte
Um ano tem 52 semanas e 1 dia ou 2 no caso de um ano colo (52 x 7 = 364). 31/12/2012 seria a semana 53, uma semana que teria apenas dois dias, porque 2012 é um ano de volta.
fonte
fonte