Pergunta

O meu problema é explicado muito straigtforward:

se eu fizer isso:

public class Main {

public static void main(String[] args) throws Exception {
        Date d = new Date(0L );
        System.out.println(d);
}

}

Eu recebo a seguinte saída: Qui Jan 01 01:00:00 CET 1970

De acordo com o documento, eu estava esperando: Qui Jan 01 00:00:00 CET 1970

Gostaria estava acontecendo de errado ...

EDIT: Na verdade, eu li o doc muito rápido. Eu deveria ter Qui Jan 01 00:00:00 GMT 1970

Então, como posso forçar o uso de GMT, e ignorar todos os tempos local?

Editar, Solução:

public static void main(String[] args) throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat("H:m:s:S");
SimpleTimeZone tz = new SimpleTimeZone(0,"ID");
sdf.setTimeZone(tz) ;
Date d = new Date(0L );
System.out.println( sdf.format(d));
}
Foi útil?

Solução

O Epoch é definido como 00:00:00 de 1970- 1-1 UTC. Desde CET é UTC + 1, é igual à 1h seu tempo.

Se você olhar para o Date (longa) construtor , você verá que ele espera que o valor a ser o número de milissegundos desde a época, UTC :

Aloca um objeto Date e inicializa para representar o número especificado de milissegundos desde o tempo base padrão conhecido como o" época", ou seja, 1 de janeiro de 1970 00:00:00 GMT.

No que diz respeito o seu desejo de forçar GMT em vez de seu fuso horário local: Em suma, a instância Data sempre usa GMT. Se você quiser apenas para formatar a seqüência de saída para que ele use GMT ter um a DateFormat classe, e, especificamente, a sua setTimeZone () método.

Outras dicas

Isso pode estar relacionado com suas configurações de localização. Supondo que você é francês e não franco-canadense, ao que parece como se o seu timestamp está sendo tratado como timestamp sem fuso horário, e as tentativas do construtor Date para corrigir isso, adicionando uma hora para a data.

Se este é o comportamento em situação irregular ou não, eu não posso te dizer.

Editar: Erro de leitura: CET = UTC: /

Então, sim, Locale fuso horário.

reeditar:. Para maior clareza total e absoluta

Saída: Qui Jan 01 01:00:00 CET 1970

A sua saída esperada: Qui Jan 01 00:00:00 CET 1970

real saída esperada: Qui Jan 01 00:00:00 GMT 1970 (= Qui Jan 01 01:00:00 CET 1970)

tl: dr

Instant.EPOCH
       .toString()

1970-01-01T00: 00: 00Z

Date::toString mentiras

Você aprendeu uma das muitas razões para evitar usar as classes java.util.Date/Calendar: uma instância Date não tem nenhuma informação de fuso horário, mas é método toString usa o fuso horário padrão quando o processamento de uma seqüência para exibição. Confundindo porque implica a data tem um fuso horário quando na verdade isso não acontece.

Evite Date / Calendar

Em vez de Data / Calendário, você deve estar usando Joda-Time ou o novo Java 8 classes, java.time. * de JSR 310.

java.time

Use a classe Instant como o equivalente a Date, um momento na linha do tempo em UTC.

Instant.now()

Para a data de referência época, use a constante.

Instant.EPOCH.toString()

1970-01-01T00: 00: 00Z

Se por "ignorar todos os tempos" Quer dizer que você realmente quer um valor apenas de data sem hora do dia, use a classe LocalDate.

LocalDate.ofEpochDay( 0L )

1970-01-01

Joda-Time Exemplo

Update:. O projeto Joda-Time agora está em modo de manutenção com a equipe aconselhando a migração para as classes java.time

Em Joda-Time, uma instância de DateTime, de fato, conhecer o seu próprio fuso horário. Você pode usar um formatador para criar saídas de cordas em outros fusos horários, se desejado.

Aqui está seu código visando a Unix tempo Epoch , mas usando Joda-Time 2.3.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTimeZone timeZone_Paris = DateTimeZone.forID( "Europe/Paris" );

DateTime epochParis = new DateTime( 0L, timeZone_Paris );
DateTime epochUtc = new DateTime( 0L, DateTimeZone.UTC );

Dump para consolar ...

System.out.println( "epochParis: " + epochParis );
System.out.println( "epochUtc: " + epochUtc );

Quando run ...

epochParis: 1970-01-01T01:00:00.000+01:00
epochUtc: 1970-01-01T00:00:00.000Z

Converter em UTC / GMT

Então, como posso forçar o uso de GMT, e ignorar todos os tempos local?

Para usar UTC / GMT (sem diferença de fuso horário), ou:

  • Converter um DateTime para outra instância com um tempo diferente zona
    (Joda-Time faz coisas imutáveis ??para thread-segurança, então nós realmente não converter, criamos novas instâncias com base em antigos.)
  • Use um formatador para criar cordas exibido para um fuso horário especificado.
// To use UTC/GMT instead of local time zone, create new instance of DateTime.
DateTime nowInParis = new DateTime( timeZone_Paris );
DateTime nowInUtcGmt = nowInParis.toDateTime( DateTimeZone.UTC );

Dump para consolar ...

System.out.println( "nowInParis: " + nowInParis );
System.out.println( "nowInUtcGmt: " + nowInUtcGmt );

Quando run ...

nowInParis: 2013-12-22T08:40:01.443+01:00
nowInUtcGmt: 2013-12-22T07:40:01.443Z

CET é uma hora à frente de GMT, que é o fuso horário usado para definir a Epoch.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top