Diferença entre UTC e GMT

❌ A resposta aceite não é nem correcta nem útil.

✅ Em contraste, a Resposta de Ole V.V. resume correctamente as diferenças técnicas – para mais detalhes seguir os links para páginas detalhadas na Wikipedia.

Para programadores que constroem aplicações orientadas para negócios, o resultado é que o UTC é o novo GMT. É possível utilizar os termos de forma intercambiável, sendo a diferença literalmente inferior a um segundo. Portanto, para todos os efeitos práticos na maioria das aplicações, não há qualquer diferença.

Aqui estão alguns conselhos mais práticos, com exemplos de código.

Strings

Diga, tenho hora UTC como “02-01-2018 00:03” isso significa que a minha hora local nos EUA é “01-01-2018 18:00”?

Que a primeira parte é um mau exemplo, com a cadeia de datas-hora sem um indicador do seu desvio ou zona.

Se uma string indicar um momento específico, deve indicar ou um fuso horário (Continent/Region nome formatado) e/ou um offset-from-UTC como um número de horas-minutos-segundos. Se a cadeia de caracteres se destina a representar um momento no próprio UTC, isso significa um offset-from-UTC de zero.

Para escrever essa cadeia de caracteres com um offset, podem ser aplicadas várias convenções. O melhor na prática é com horas e minutos juntamente com dois pontos, tais como +00:00+05:30, ou -08:00. O zero inicial e os dois pontos são ambos opcionais, mas tenho visto bibliotecas a quebrar quando encontro um valor como -0800 ou -8.

Zulu

Como atalho para um desvio de zero, a letra Z é normalmente usada para significar o próprio UTC. Pronunciado Zulu.

ISO 8601

Furthermore, as melhores práticas de formatação de texto data/hora para computação são para nós os formatos padrão ISO 8601. Para uma data/hora é utilizado o formato YYYYY-MM-DDTHH:MM:SS±HH:MM:SS. O T separa a parte da data da parte da hora do dia. Este formato tem vantagens tais como ser largamente inequívoco, fácil de analisar por máquina, fácil de ler pelos humanos através das culturas. Outra vantagem é a classificação por ordem alfabética é também cronológica. O padrão aceita o Z abreviatura também.

p> Então o seu exemploUTC time as "02-01-2018 00:03"é melhor indicado como2018-01-02T00:03Z.

java.time

estar muito consciente de que a maioria das linguagens de programação, bibliotecas, e bases de dados têm muito pouco suporte para o tratamento da data/hora, geralmente com base numa má compreensão das questões de data/hora. O manuseio da data/hora é surpreendentemente complicado e complicado de dominar.

A única biblioteca decente que encontrei é a classe java.time (ver Tutorial) empacotada com Java 8 e posteriores, e a sua antecessora o projecto Joda-Time (também vagamente portada de Java para .Net no projecto Noda Time).

Em java.time, um momento é representado de três maneiras. Todos têm uma resolução de nanossegundos.

  • br>Sempre em UTC. Tecnicamente, uma contagem de nanossegundos desde a referência de época do primeiro momento de 1970 (1970-01-01T00:00:00Z).
  • OffsetDateTimebr>>uma data com hora do dia no contexto de um certo número de horas-minutos-segundos à frente, ou atrás, do UTC.
  • ZonedDateTime
    Uma data com a hora do dia no contexto de um determinado fuso horário.

Então, qual é a diferença entre um fuso horário e uma compensação – do UTC? Porque é que precisamos de classes separadas? Um offset-from-UTC é simplesmente um número de horas-minutos-segundos, três números, nada mais, nada menos. Um fuso horário em muito mais. Um fuso horário é uma história de mudanças passadas, presentes e futuras na compensação utilizada pelas pessoas de uma determinada região.

Que mudanças? Mudanças ditadas pelos caprichos ou pela sabedoria dos seus políticos. Políticos de todo o mundo têm demonstrado uma predilecção pela mudança do offset utilizado pelo(s) fuso(s) horário(s) na sua jurisdição. O Horário de Verão (DST) é um padrão comum de mudanças, com o seu horário frequentemente alterado e a decisão de decretar ou reverter de DST por vezes alterada. Outras mudanças também acontecem, tais como apenas nos últimos anos a Coreia do Norte mudou o seu relógio em meia hora para sincronizar com a Coreia do Sul, a Venezuela voltou atrás no seu relógio em meia hora apenas para saltar para trás menos de uma década mais tarde, a Turquia cancelou este ano a mudança programada de DST para a hora normal com pouca antecedência, e a Rússia contemporânea tem feito múltiplas mudanças deste tipo nos últimos anos.

Volte ao seu exemplo no seu ponto # 3, vejamos algum código.

Diga, tenho a hora UTC como “02-01-2018 00:03” isso significa que a minha hora local nos EUA é “01-01-2018 18:00”?

As suas cordas de exemplo têm outro problema. Que 03 minuto na primeira parte é ignorado a sua segunda parte, uma gralha aparente. Eu sei porque não há nenhum ajuste de fuso horário em vigor nas Américas nessa data, envolvendo uma hora fracionada de 57 minutos.

Não um momento

P>Primeiro, analisamos a sua cadeia de entrada. Na ausência de qualquer indicador de zona ou offset, devemos analisar utilizando o LocalDateTime. O nome LocalDateTime pode ser enganador, uma vez que significa uma localidade específica. Significa qualquer localidade ou todas as localidades. Para mais explicações, ver Qual é a diferença entre Instant Time e LocalDateTime?

String input = "2018-01-02T00:03" ; // Text of a date with time-of-day but without any context of time zore or offset-from-UTC. *Not* a moment, *not* a point on the timeline.LocalDateTime ldt = LocalDateTime.parse( input ) ; // Parsing the input as a `LocalDateTime`, a class representing a date with time but no zone/offset. Again, this does *not* represent a moment, is *not* a point on the timeline. 

UTC

Pelos factos apresentados na Pergunta, sabemos que esta data e hora se destinava a representar um momento no UTC. Assim, podemos atribuir o contexto de uma compensação – de UTC de zero horas-minutos-segundos para o próprio UTC. Aplicamos um ZoneOffset constante UTC para obter um objecto OffsetDateTime.

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ); // We are certain this text was intended to represent a moment in UTC. So correct the faulty text input by assigning the context of an offset of zero, for UTC itself.

Time zone

A Pergunta pede para ver este momento através de um tempo de seis horas atrás do UTC utilizado nos Estados Unidos. Um fuso horário com tal compensação é America/Chicago.

Especificar um nome de fuso horário adequado no formato de continent/region, tal como America/MontrealAfrica/Casablanca, ou Pacific/Auckland. Nunca usar a abreviatura de 2-4 letras como CSTEST, ou IST uma vez que não são fusos horários verdadeiros, não padronizados, e nem sequer únicos(!).

ZoneId z = ZoneId.of( "America/Chicago" ) ; // Adjust from UTC to a time zone where the wall-clock time is six hours behind UTC.ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

Ver este código correr ao vivo em IdeOne.com.

odt.toString(): 2018-01-02T00:03Z

zdt.toString(): 2018-01-01T18:03-06:00

Mesmo momento, tempo de relógio de parede diferente

This odt e zdt ambos representam o mesmo momento simultâneo, o mesmo ponto na linha temporal. A única diferença é o tempo do relógio de parede.

Vamos dar um exemplo, utilizando a Islândia onde o seu fuso horário utiliza uma compensação – de-UTC de zero horas-minutos-segundos. Assim, a zona Atlantic/Reykjavik tem um tempo de parede-relógio idêntico ao UTC. Pelo menos actualmente, o seu relógio de parede coincide com o UTC; no passado ou no futuro pode ser diferente, razão pela qual é incorrecto dizer “UTC é o fuso horário da Islândia”. De qualquer modo, o nosso exemplo… diz alguém em Reykjavík, Islândia, com 3 minutos depois da meia-noite no relógio pendurado na parede, faz uma chamada telefónica para alguém nos EUA. Essa pessoa dos EUA vive num local que utiliza o fuso horário da região de Chicago. Quando a pessoa chamada pega no seu telefone, olha para o relógio pendurado na parede para ver que a hora é pouco depois das 18:03 horas. O mesmo momento, hora diferente do relógio de parede.

Também os calendários pendurados nas suas paredes são diferentes, pois é “amanhã” na Islândia mas “ontem” no continente americano. Mesmo momento, datas diferentes!

Tabela de tipos de data/hora em Java, tanto moderno como legado.

Sobre java.time

A estrutura java.time está integrada no Java 8 e posteriores. Estas classes suplantam as antigas classes de data/hora do legado problemático, tais como java.util.DateCalendar&SimpleDateFormat.

O projecto Joda-Time, agora em modo de manutenção, aconselha a migração para as aulas java.time.

Para saber mais, ver o Tutorial Oracle. E procurar Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310.

Pode trocar objectos java.time directamente com a sua base de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não necessita de strings, não necessita de java.sql.* classes.

Onde obter as classes java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11, e mais tarde – Parte da API padrão Java com uma implementação empacotada.
      li>Java 9 adiciona algumas características menores e correcções.
  • Java SE 6 e Java SE 7
      >li>Maior parte do java.time.A funcionalidade do tempo é retroportada para Java 6 & 7 em ThreeTen-Backport.
  • Android
    • Versões posteriores das implementações do pacote Android do java.classes de tempo.
    • para Android anterior (<26), o projecto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima). Ver Como usar ThreeTenABP….
  • Tabela da qual biblioteca java.time para usar com que versão de Java ou Android

    O projecto ThreeTen-Extra estende o java.time com classes adicionais. Este projecto é um campo de provas para possíveis adições futuras ao java.time. Pode encontrar algumas classes úteis aqui, tais como IntervalYearWeekYearQuarter, e mais.

    Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *