Quero obter o primeiro dia e o último dia do mês em que uma determinada data se encontra. A data vem de um valor em um campo da interface do usuário.
Se eu estiver usando um seletor de horas, eu poderia dizer
var maxDay = dtpAttendance.MaxDate.Day;
Mas estou tentando obtê-lo de um objeto DateTime. Então, se eu tiver isso ...
DateTime dt = DateTime.today;
Como obter o primeiro dia e o último dia do mês dt
?
_Date
variável. Que "mínimo e máximo" você está tentando obter desse valor?Respostas:
DateTime
estrutura armazena apenas um valor, não intervalo de valores.MinValue
eMaxValue
são campos estáticos, que mantêm o intervalo de valores possíveis para instâncias daDateTime
estrutura. Esses campos são estáticos e não estão relacionados a uma instância específica deDateTime
. Eles se relacionam com oDateTime
próprio tipo.Leitura sugerida: estática (Referência de C #)
UPDATE: Obtendo o intervalo do mês:
fonte
lastDayofMonth
serfirstDayOfMonth.AddMonths(1).AddSeconds(-1);
?AddTicks(-1)
, mas se não se preocupam com parte tempo e pensar só em parte data, em seguida, dias de trabalho muito bem< firstDayOfNextMonth
vez de<= lastDayOfMonth
. Dessa forma, sempre funcionará independentemente da granularidade. (Eu tenho certeza que os carrapatos vai ficar bem, mas quem sabe o que o futuro traz ... nanoticks?)Este é mais um longo comentário sobre as respostas de @Sergey e @ Steffen. Tendo escrito um código semelhante no passado, decidi verificar o que tinha melhor desempenho , lembrando que a clareza também é importante.
Resultado
Aqui está um exemplo de resultado da execução de teste para 10 milhões de iterações:
Código
Usei o LINQPad 4 (no modo de programa C #) para executar os testes com a otimização do compilador ativada. Aqui está o código testado consignado como métodos de extensão para maior clareza e conveniência:
Análise
Fiquei surpreso com alguns desses resultados.
Embora não haja muito,
FirstDayOfMonth_AddMethod
foi um pouco mais rápido do queFirstDayOfMonth_NewMethod
na maioria das execuções do teste. No entanto, acho que o último tem uma intenção um pouco mais clara e, portanto, tenho uma preferência por isso.LastDayOfMonth_AddMethod
foi um perdedor claro contraLastDayOfMonth_AddMethodWithDaysInMonth
,LastDayOfMonth_NewMethod
eLastDayOfMonth_NewMethodWithReuseOfExtMethod
. Entre os três mais rápidos, não há muito, e isso se resume a sua preferência pessoal. Escolho a clarezaLastDayOfMonth_NewMethodWithReuseOfExtMethod
com a reutilização de outro método de extensão útil. IMHO sua intenção é mais clara e estou disposto a aceitar o pequeno custo de desempenho.LastDayOfMonth_SpecialCase
assume que você está fornecendo o primeiro dia do mês no caso especial em que você já pode ter calculado essa data e que usa o método add comDateTime.DaysInMonth
para obter o resultado. Isso é mais rápido do que as outras versões, como seria de esperar, mas, a menos que você esteja precisando desesperadamente de velocidade, não vejo sentido em ter esse caso especial em seu arsenal.Conclusão
Aqui está uma classe de método de extensão com minhas escolhas e, de acordo com o @Steffen, acredito:
Se você chegou até aqui, obrigado pelo tempo! Tem sido divertido: ¬). Por favor, comente se você tiver outras sugestões para esses algoritmos.
fonte
LastDayOfMonth_AddMethod_SpecialCase
(ou algo parecido). Esperando o primeiro dia do mês como parâmetro, acho que o mais rápido deve ser o queLastDayOfMonth_AddMethod
faz! De modo que seria tão simples como:return value.AddMonths(1).AddDays(-1);
Obtendo o intervalo de meses com a API .Net (apenas outra maneira):
fonte
"
Last day of month
" é realmente "First day of *next* month, minus 1
". Então, aqui está o que eu uso, não há necessidade do método "DaysInMonth":NOTA: O uso razão que eu
AddMinutes(-1)
, nãoAddDays(-1)
aqui é porque geralmente você precisa destas funções de data para relatar para alguma data-período, e quando você constrói um relatório por um período, a "data final" deve realmente ser algo comoOct 31 2015 23:59:59
que o seu relatório funciona corretamente - incluindo todos os dados do último dia do mês.Ou seja, você realmente recebe o "último momento do mês" aqui. Não é o último dia.
OK, eu vou calar a boca agora.
fonte
fonte
description
que ajude a explicar seu código. GraçasAqui você pode adicionar um mês para o primeiro dia do mês atual e excluir um dia desse dia.
fonte
Se você se importa apenas com a data
Se você quer economizar tempo
fonte
A resposta aceita aqui não leva em consideração a instância Kind of the DateTime. Por exemplo, se sua instância original de DateTime era um tipo UTC, criando uma nova instância de DateTime, você criará uma instância de Tipo desconhecido, que será tratada como hora local com base nas configurações do servidor. Portanto, a maneira mais adequada de obter a primeira e a última data do mês seria:
Dessa forma, o tipo original da instância DateTime é preservado.
fonte
Tente este:
fonte
Usei isso no meu script (funciona para mim), mas precisava de uma data completa sem a necessidade de apará-la apenas para a data e sem tempo.
fonte
Faça uma tentativa. Basicamente, calcula o número de dias que passou
DateTime.Now
, subtrai um deles e usa o novo valor para encontrar o primeiro do mês atual. A partir daí, ele usa issoDateTime
e usa.AddMonths(-1)
para obter o primeiro do mês anterior.Obter o último dia do mês passado faz basicamente a mesma coisa, exceto que ele adiciona um ao número de dias no mês e subtrai esse valor
DateTime.Now.AddDays
, fornecendo o último dia do mês anterior.fonte
Para a cultura persa
fonte
Você consegue
fonte
maneira fácil de fazer isso
fonte
fonte