2014-12-05 13 views
5

Cosa mi manca? Date() è il numero di millisecondi che sono trascorsi da mezzanotte, 1 gennaio 1970. La mezzanotte non dovrebbe iniziare alle 0:00?Java time: inizia il 1 gennaio 1970 alle 1:00?

Riferimenti:

Il mio programma di test:

package be.test.package.time; 

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import java.util.Locale; 

public class TimeWork { 

    public static void main(String[] args) {  

     List<Long> longs = new ArrayList<>(); 
     List<String> strings = new ArrayList<>(); 

     DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss.SSS"); 

     //Now 
     Date now = new Date(); 
     strings.add(formatter.format(now)); 

     //Test dates 
     strings.add("01-01-1970 00:00:00.000"); 
     strings.add("01-01-1970 01:00:00.000"); 
     strings.add("31-11-1969 00:00:00.000"); 
     strings.add("01-01-2014 00:00:00.000"); 

     //Test data 
     longs.add(-1L); 
     longs.add(0L); 
     longs.add(1L); 
     longs.add(7260000L); 
     longs.add(1417706084037L); 
     longs.add(-7260000L); 

     //Show the long value of the date 
     for (String string: strings) { 
      try { 
       Date date = formatter.parse(string); 
       System.out.println("Formated date : " + string + " = Long = " + date.getTime()); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
     } 

     //Show the date behind the long 
     for (Long lo : longs) { 
      Date date = new Date(lo); 
      String string = formatter.format(date); 
      System.out.println("Formated date : " + string + " = Long = " + lo);   
     } 
    } 
} 

Questo sono i risultati:

Formated date : 05-12-2014 08:54:59.318 = Long = 1417766099318 
Formated date : 01-01-1970 00:00:00.000 = Long = -3600000 
Formated date : 01-01-1970 01:00:00.000 = Long = 0 
Formated date : 31-11-1969 00:00:00.000 = Long = -2682000000 
Formated date : 01-01-2014 00:00:00.000 = Long = 1388530800000 
Formated date : 01-01-1970 12:59:59.999 = Long = -1 
Formated date : 01-01-1970 01:00:00.000 = Long = 0 
Formated date : 01-01-1970 01:00:00.001 = Long = 1 
Formated date : 01-01-1970 03:01:00.000 = Long = 7260000 
Formated date : 04-12-2014 04:14:44.037 = Long = 1417706084037 
Formated date : 31-12-1969 10:59:00.000 = Long = -7260000 

Perché è:

Formated date : 01-01-1970 01:00:00.000 = Long = 0 

questo è al 01:00. Mi aspettavo 0:00.

+8

Qual è il fuso orario? –

+1

Il mio fuso orario è CET - Ora di Bruxelles/Belgio. –

+2

Sei in anticipo sui tuoi tempi :-) –

risposta

8

1 gennaio 1970 a mezzanotte UTC. È necessario il TimeZone come

public static void main(String[] args) { 
    TimeZone tz = TimeZone.getTimeZone("UTC"); 
    Calendar cal = Calendar.getInstance(tz); 
    cal.setTimeInMillis(0); 
    DateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss.SSS"); 
    sdf.setTimeZone(tz); 
    System.out.println(sdf.format(cal.getTime())); 
} 

uscita è

01-01-1970 12:00:00.000 
+0

Quando non imposto TimeZone nell'istanza di 'Calendar', ottengo lo stesso risultato. Ma questo significa che 'DateFormat' dipende dal fuso orario? – GameDroids

+0

@GameDroids Ricorda che un 'Calendar' è una struttura di fantasia in cima al numero di millisecondi dal 1/1/1970 @ 12: 00.000; Sì, 'DateFormat' include il' TimeZone' che potrebbe aver bisogno di sapere che ora è dove sei quando sono le 3 pm dove sono. –

+1

Grazie per la spiegazione! Ho controllato la stringa del calendario quando era impostata su "HOUR_OF_DAY = 1', quindi' DateFormat' deve averlo riconvertito in tempo 'UTC'. – GameDroids

3

Il tempo rappresentato dal lungo 0 è mezzanotte 1/1/1970 UTC. Questo capita di essere l'1/1/1/197070 CET. Ma dal momento che si sta utilizzando un SimpleDateFormat il cui fuso orario è impostato CET,

  • 1/1/1970 01:00 è il tempo che viene visualizzato quando si formatta la data;
  • parsing 1/1/1970 01:00 ti dà il tempo rappresentato da una lunga 0.

Se tu avessi un SimpleDateFormat il cui fuso orario è stato impostato su UTC, il comportamento sarebbe stato completamente diverso.

Se si desidera utilizzare un fuso orario diverso da CET, è possibile utilizzare il metodo setTimeZone di DateFormat.

1

Le altre due risposte sono corrette.

A proposito, questo tipo di lavoro di data-ora è molto più semplice utilizzando la libreria Joda-Time o lo java.time package (ispirato a Joda-Time). Entrambe queste librerie hanno classi data-ora che hanno un fuso orario chiaramente assegnato (diversamente da java.util.Date/.Calendar).

Sia Joda-Time che java.time utilizzano lo stesso epoch: 1970-01-01T00:00:00Z.

Entrambi usano i formati standard ISO 8601 quando generano una rappresentazione testuale dei loro valori di data e ora.

Joda-Time

In Joda-Time 2.7.

DateTime epoch = new DateTime(0 , DateTimeZone.UTC); 

java.time

In java.time di Java 8 Update 45.

ZonedDateTime epoch = ZonedDateTime.ofInstant(Instant.EPOCH , ZoneOffset.UTC) ;