Java.util.Calendrier-millisecondes depuis le 1er janvier 1970


Programme suivi de la sortie. Quelqu'un s'il vous plait m'expliquer pourquoi 10 000 000 millisecondes du 1er janvier 1970 est le 31 novembre 1969. Eh bien, quelqu'un veuillez expliquer ce qui ne va pas avec mon hypothèse selon laquelle le premier test devrait produire un temps de 10 000 000 millisecondes à partir du 1er janvier 1970. Les nombres inférieurs à 10 000 000 produisent le même résultat.

public static void main(String[] args) {

    String x = "10000000";
    long l = new Long(x).longValue();
    System.out.println("Long value: " + l);

    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);

    x = "1000000000000";
    l = new Long(x).longValue();
    System.out.println("\nLong value: " + l);

    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);
}

Valeur longue: 10000000

Heure du calendrier en Millis: 10000000

Date au format AAAA-MM-JJ: 1969-11-31

Valeur longue: 1000000000000

Heure du calendrier en Millis: 1000000000000

Date au format AAAA-MM-JJ: 2001-8-8

Author: Chris Jester-Young, 2008-11-04

6 answers

Les dates que vous imprimez à partir de Calendar sont locales à votre fuseau horaire, alors que l'époque est définie comme étant minuit de 1970-01-01 en UTC. Donc, si vous vivez dans un fuseau horaire à l'ouest de UTC, alors votre date apparaîtra comme 1969-12-31, même si (en UTC) c'est toujours 1970-01-01.

 12
Author: Chris Jester-Young, 2008-11-04 21:03:29

Tout d'abord, c. get(Calendar.MOIS) renvoie 0 pour Jan, 1 pour février, etc.

Deuxièmement, utilisez DateFormat pour afficher les dates.

Troisièmement, vos problèmes sont un excellent exemple de la maladresse de l'API de date de Java. Utilisez l'API Joda Time si vous le pouvez. Cela vous facilitera un peu la vie.

Voici un meilleur exemple de votre code, qui indique le fuseau horaire:

public static void main(String[] args) {

    final DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);

    long l = 10000000L;
    System.out.println("Long value: " + l);
    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Date: " + dateFormat.format(c.getTime()));

    l = 1000000000000L;
    System.out.println("\nLong value: " + l);
    c.setTimeInMillis(l);
    System.out.println("Date: " + dateFormat.format(c.getTime()));
}
 6
Author: Steve McLeod, 2008-11-05 07:52:29

Calendar # setTimeInMillis () définit l'heure du calendrier sur le nombre de millisecondes après le 1er janvier 1970 GMT.

Calendar # get () renvoie le champ demandé ajusté pour le fuseau horaire du calendrier qui, par défaut, est le fuseau horaire local de votre machine.

Cela devrait fonctionner comme prévu si vous spécifiez le fuseau horaire" GMT " lorsque vous construisez le calendrier:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
 5
Author: Mike, 2008-11-04 21:18:48

Malheureusement, java.util.Date et java.util.Calendar ont été mal conçus conduisant à ce genre de confusion.

 3
Author: Julien Chastang, 2008-11-05 00:25:11

Votre fuseau horaire est très probablement en retard sur GMT (par exemple, GMT-5), donc 10 000 000 ms de l'époque est le 31 décembre 1969 dans votre fuseau horaire, mais puisque les mois sont basés sur zéro en java.util.Calendrier votre conversion Calendrier - > texte est défectueuse et vous obtenez 1969-11-31 au lieu du 1969-12-31 attendu.

 1
Author: Alexander, 2008-11-05 00:16:56

Vous pouvez vous comprendre si vous changez votre premier c.setTimeInMillis(l); dans c.clear();

 0
Author: Davide, 2008-11-04 21:02:07