Estou tentando comparar um carimbo de data / hora de uma solicitação recebida com um valor armazenado no banco de dados. É claro que o SQL Server mantém alguma precisão de milissegundos no tempo e, quando lido em um .NET DateTime, inclui esses milissegundos. A solicitação de entrada para o sistema, no entanto, não oferece essa precisão, portanto, preciso simplesmente eliminar os milissegundos.
Sinto que estou perdendo algo óbvio, mas não encontrei uma maneira elegante de fazer isso (C #).
string
representação formatada de aDateTime
, talvez seja necessária uma edição para deixar claro que "truncar" / "drop" milissegundos significa "produz umDateTime
valor em que todos os componentes de data / hora são os mesmos, excetoTimeOfDay.TotalMilliseconds
é0
". As pessoas não leem, é claro, mas apenas para eliminar qualquer ambiguidade.Respostas:
O seguinte funcionará para um DateTime que possui milissegundos fracionários e também preservará a propriedade Kind (Local, Utc ou Indefinido).
ou o equivalente e menor:
Isso pode ser generalizado em um método de extensão:
que é usado da seguinte maneira:
fonte
fonte
Aqui está um método de extensão baseado em uma resposta anterior que permitirá truncar para qualquer resolução ...
Uso:
Classe:
fonte
fonte
Millisecond
propriedade fornece um número inteiro entre 0 e 999 (inclusive). Portanto, se a hora do dia anterior à operação foi, digamos23:48:49.1234567
,, esse número inteiro será123
e a hora do dia após a operação23:48:49.0004567
. Portanto, não foi truncado por um número inteiro de segundos.Às vezes, você deseja truncar para algo baseado em calendário, como ano ou mês. Aqui está um método de extensão que permite escolher qualquer resolução.
fonte
Em vez de reduzir os milissegundos e comparar, por que não comparar a diferença?
ou
fonte
Menos óbvio, mas duas vezes mais rápido:
fonte
d.AddMilliseconds(-d.Millisecond)
,, não necessariamente move o DateTime exatamente para o segundo inteiro anterior.d.Ticks % TimeSpan.TicksPerMillisecond
os ticks (algo entre 0 e 9.999) além do segundo permanecerão.Para arredondar para o segundo:
Substitua por
TicksPerMinute
para arredondar para o minuto.Se seu código é sensível ao desempenho, tenha cuidado com
Meu aplicativo estava gastando 12% do tempo da CPU em System.DateTime.GetDatePart .
fonte
Uma maneira de facilitar a leitura é ...
E mais...
fonte
var now = DateTime.Parse(DateTime.Now.ToString())
funciona bem.Em relação à resposta de Diadistis. Isso funcionou para mim, exceto que eu tive que usar o Floor para remover a parte fracionária da divisão antes da multiplicação. Assim,
torna-se
Eu esperava que a divisão de dois valores Long resultasse em um Long, removendo assim a parte decimal, mas a resolve como um Double, deixando exatamente o mesmo valor após a multiplicação.
Eppsia
fonte
2 Métodos de extensão para as soluções mencionadas acima
uso:
fonte
Não é a solução mais rápida, mas simples e fácil de entender:
fonte
E pelo uso de
: P
fonte
string
em vez de umDateTime
, mas isso omite componentes de tempo a partir da saída completamente . (Isso torna o acesso aToday
propriedade desnecessária, também.)Novo método
// define o parâmetro de passagem da seqüência de caracteres dd-mmm-aaaa retorno 24 de fevereiro de 2016
Ou mostrado na caixa de texto
// coloca em PageonLoad
fonte
string
em vez de umDateTime
, mas isso omite componentes de tempo a partir da saída completamente . (Isso torna o acesso aToday
propriedade desnecessária, também.)No meu caso, eu pretendia salvar o TimeSpan da ferramenta datetimePicker sem salvar os segundos e os milissegundos, e aqui está a solução.
Primeiro converta o datetimePicker.value para o formato desejado, que é "HH: mm", depois converta-o novamente para TimeSpan.
fonte
string
) de fazer isso seriaDateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0);
Ou você poderia usar uma variação do método de extensão de Joe que opera comTimeSpan
valores e usaTimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));
para truncar segundos.Esta é a minha versão dos métodos de extensão postados aqui e em perguntas semelhantes. Isso valida o valor dos ticks de uma maneira fácil de ler e preserva o DateTimeKind da instância original do DateTime. (Isso tem efeitos colaterais sutis, mas relevantes, ao armazenar em um banco de dados como o MongoDB.)
Se o verdadeiro objetivo é truncar um DateTime para um valor especificado (ou seja, Horas / Minutos / Segundos / MS), recomendo implementar esse método de extensão no seu código. Ele garante que você só pode truncar com uma precisão válida e preserva os metadados importantes DateTimeKind da sua instância original:
Então você pode usar o método como este:
fonte
Eu sei que a resposta é muito tarde, mas a melhor maneira de se livrar dos milissegundos é
Tente imprimir o valor da variável, ela mostrará a data e hora, sem milissegundos.
fonte