Epoch não é época se fazer uma nova data (0D). Por quê?
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));
}
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 ??p>
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.