2008-11-04 13 views
8

Programm gefolgt von Ausgabe. Jemand bitte erklären Sie mir, warum 10.000.000 Millisekunden vom 1. Januar 1970 der 31. November 1969 ist. Nun, jemand bitte erklären, was falsch ist mit meiner Annahme, dass der erste Test eine Zeit 10.000.000 Millisekunden vom 1. Januar 1970 produzieren sollte. Zahlen kleiner als 10.000.000 produzieren das gleiche Ergebnis.Java.util.Calendar - Millisekunden seit dem 1. Januar 1970

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); 
} 

Long-Wert: 10000000

Kalender Zeit in Millis: 10000000

Datum in YYYY-MM-DD-Format: 1969-11-31

Long-Wert: 1000000000000

Kalenderzeit in Millis: 1000000000000

Datum in YYYY-MM-DD-Format: 2001-8-8

Antwort

12

die Termine für Sie drucken von Calendar zu Ihrer Zeitzone sind Lokal , während die Epoche um Mitternacht des 1970-01-01 in UTC definiert ist. Wenn Sie also in einer Zeitzone westlich von UTC leben, wird Ihr Datum als 1969-12-31 angezeigt, obwohl (in UTC) immer noch 1970-01-01.

+2

Danke! Ich dachte, ich würde verrückt werden. –

0

Sie können sich ausrechnen, wenn Sie Ihre erste c.setTimeInMillis(l); in c.clear();

ändern
6

Zuerst c.get (Calendar.MONTH) liefert 0 für Jan, 1 für Februar usw.

Zweitens verwenden Dateformat zu Ausgabedaten.

Drittens sind Ihre Probleme ein gutes Beispiel dafür, wie umständlich Javas Date API ist. Verwenden Sie Joda Time API, wenn Sie können. Es wird dein Leben etwas einfacher machen.

Hier ist ein besseres Beispiel für den Code, der die Zeitzone angibt:

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())); 
} 
+0

Sehr hilfreich; Sie haben meine Frage ein wenig indirekt beantwortet. Das Zeitzonen-Ding verursachte mir die meiste Verwirrung.Der verbesserte Code wird sehr geschätzt. –

5

Calendar#setTimeInMillis() setzt die Zeit des Kalenders auf die Anzahl von Millisekunden nach dem 1. Januar 1970 GMT.

Calendar#get() gibt das angeforderte Feld zurück, das für die Zeitzone des Kalenders angepasst wurde und standardmäßig der lokalen Zeitzone des Geräts ist. wenn Sie „GMT“ Zeitzone angeben, wenn Sie den Kalender konstruieren

Dies sollte wie erwartet:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT")); 
+0

Danke für das Codebeispiel. –

1

Ihre Zeitzone wird höchstwahrscheinlich hinter GMT hinkt (zB GMT-5), daher 10,000,000ms aus Epoche ist der 31. Dezember 1969 in deiner Zeitzone, aber da Monate Null sind basiert in java.util.Calendar deine Kalender-> Textkonvertierung fehlerhaft und du bekommst 1969-11-31 statt der erwarteten 1969-12-31.

3

Leider waren java.util.Date und java.util.Calendar schlecht entworfen, was zu dieser Art von Verwirrung führte.

Verwandte Themen