NET 6 - TimeOnly : Usando apenas Time
Hoje veremos o novo recurso TimeOnly do .NET 6 na linguagem C#. |
Continuando o artigo anterior vejamos agora novo recurso TimeOnly do NET 6.
Se você trabalhou com datas e horas na plataforma .NET, provavelmente já usou DateTime, DateTimeOffset, TimeSpan e TimeZoneInfo. No artigo anterior apresentei o novo recurso DateOnly que permite trabalhar com apenas datas sem ser obrigado a usar horas.
O recurso TimeOnly permite representar apenas a parte relativa a horas de uma data. Assim se DateOnly for a parte relativa apenas a data de um DateTime, TimeOnly vai atuar na parte referente a hora no DateTime.
Esses dois novos tipos são structs (tipos de valor) e podem ser usados quando seu código lida com conceitos de data ou hora de forma independente. Ambos os tipos podem ser encontrados no namespace System.
O uso desses novos tipos pode se alinhar bem com a forma como os bancos de dados permitem que dados semelhantes sejam representados. Especificamente, esses tipos se alinham bem com os tipos de dados de date e time do SQL Server.
Usando TimeOnly
Nos exemplos a seguir estou usando o VS 2022 e a versão do NET 6 RC1 em um projeto Console.
A struct TimeOnly representa uma hora do dia, como seria lida em um relógio, no intervalo de 00:00:00 a 23: 59: 59,9999999. Ela tem várias sobrecargas de construtor. Os mais comuns nos permitem criar uma data aceitando :
public TimeOnly(int hour, int minute)
public TimeOnly(int hour, int minute, int second)
public TimeOnly(int hour, int minute, int second, int millisecond)
|
Assim para representar 10:35 da manhã podemos criar uma instância de TimeOnly assim:
Espera-se que a parte das horas seja fornecida usando o formato de relógio de 24 horas. Internamente, o TimeOnly armazena um long que representa o número de tiques (intervalos de 100 nanossegundos) que decorreram desde a meia-noite na hora definida. Por exemplo, 1h é 1 hora no início do dia e, portanto, 36.000.000.000 de tiques desde a meia-noite (00: 00: 00.0000000).
Vamos definir outra hora usando o construtor para informar os segundos:
Como temos a hora inicial e hora final vamos realizar alguns cálculos usando TimeOnly. Para isso podemos simplesmente subtrair as duas horas e usar o método TotalHours que representa o número total de horas:
Resultado obtido na execução do projeto:
Assim podemos subtrair para descobrir quanto tempo se passou entre duas vezes. A ordem usada é importante, pois este é um relógio circular. Assim no exemplo a seguir
Como vemos, a ordem usada para subtrais as duas instâncias de TimeOnly afeta o resultado final.
Outra tarefa que podemos realizar é verificar se um determinado TimeOnly cai dentro de uma janela de tempo.
Por exemplo, digamos que queremos verificar se a hora atual está entre as horas de início e de término já definidas. Assim como com DateOnly, podemos converter de um DateTime existente em um TimeOnly usando o método estático FromDateTime. A seguir temos o método IsBetween que retorna true se o valor estiver contido no intervalo de horas.
Resultado da execução:
O método IsBetween aceita intervalos normais, bem como intervalos que vão da meia-noite, como 22:00-02:00.
Podemos também definir uma hora a partir de uma string, usando um formato válido, e também adicionar horas, minutos e segundos a uma hora inicial e obter a hora final.
Neste exemplo usamos o método AddHours(). Temos também os métodos AddMinutes().
Outro recurso que TimeOnly oferece são os operadores para comparar horas usando um relógio circular. Assim podemos comparar duas instâncias de TimeOnly :
Se a comparação for verdadeira será retornado True caso contrário False.
Resultado:
a
Apresentamos assim um visão geral sobre o TimeOnly. Existem outros recursos ele oferece e que iremos abordar em outro artigo.
Pegue o projeto aqui : TimeOnly1.zip (sem as referências. Precisa do NET 6)
"Bem-aventurado
o homem que sofre a tentação; porque, quando for provado, receberá a coroa da
vida, a qual o Senhor tem prometido aos que o amam."
Tiago 1:12
Referências:
NET 6 - Global Using : Usando o modificador global na diretiva using