Ich möchte das aktuelle Datum als Ganzzahlform konvertieren. Standardmäßig wird lange zurückgegeben. Wenn ich versuche, die Ganzzahl als Ganzes zu konvertieren und dann den Ganzzahlwert in Datum umzuwandeln, bedeutet dies, dass das Datum der 1970er Jahre angezeigt wird.
int i = (int) new Date().getTime();
System.out.println("Integer : " + i);
System.out.println("Long : "+ new Date().getTime());
System.out.println("Long date : " + new Date(new Date().getTime()));
System.out.println("Int Date : " + new Date(i));
die Ausgabe wird
Integer : 1292838124
Long : 1345617601771
Long date : Wed Aug 22 12:10:01 IST 2012
Int Date : Fri Jan 16 04:37:18 IST 1970
Bitte helfen Sie mir, wie Sie das aktuelle Datum als Ganzzahl (10-stellige Zahl) konvertieren.
Das Problem ist, dass eine ganze Zahl nicht groß genug ist, um ein aktuelles Datum zu speichern. Sie müssen ein Long verwenden.
Das Datum wird intern in Millisekunden seit dem 1.1.1970 gespeichert.
Der maximale Integer-Wert beträgt 2147483648, während die Anzahl der Millisekunden seit 1970 derzeit in der Größenordnung von 1345618537869 liegt
Wenn Sie den maximalen ganzzahligen Wert in ein Datum setzen, erhalten Sie den Montag, 26. Januar 1970.
Bearbeiten: Code, um die Division durch 1000 gemäß dem folgenden Kommentar anzuzeigen:
int i = (int) (new Date().getTime()/1000);
System.out.println("Integer : " + i);
System.out.println("Long : "+ new Date().getTime());
System.out.println("Long date : " + new Date(new Date().getTime()));
System.out.println("Int Date : " + new Date(((long)i)*1000L));
Integer : 1345619256
Long : 1345619256308
Long date : Wed Aug 22 16:37:36 CST 2012
Int Date : Wed Aug 22 16:37:36 CST 2012
Um das aktuelle Datum als Ganzzahl (10-stellige Zahl) zu erhalten, müssen Sie den langen Wert des neuen Datums (). GetTime () durch 1000 teilen.
Dies wird im int-Bereich liegen und ist bis zum 18. Januar 2038 gültig.
Wenn Sie seit dem 1. Januar 1970 nur eine ganze Zahl benötigen, die verstrichene Tage darstellt, können Sie diese versuchen:
// magic number=
// millisec * sec * min * hours
// 1000 * 60 * 60 * 24 = 86400000
public static final long MAGIC=86400000L;
public int DateToDays (Date date){
// convert a date to an integer and back again
long currentTime=date.getTime();
currentTime=currentTime/MAGIC;
return (int) currentTime;
}
public Date DaysToDate(int days) {
// convert integer back again to a date
long currentTime=(long) days*MAGIC;
return new Date(currentTime);
}
Kürzer aber weniger lesbar (etwas schneller?):
public static final long MAGIC=86400000L;
public int DateToDays (Date date){
return (int) (date.getTime()/MAGIC);
}
public Date DaysToDate(int days) {
return new Date((long) days*MAGIC);
}
Hoffe das hilft.
BEARBEITEN: Dies könnte bis Freitag, 11. Juli, 01:00:00 Uhr (5881580) funktionieren
Brauchen Sie so etwas (ohne Zeit)?
public static Integer toJulianDate(Date pDate) {
if (pDate == null) {
return null;
}
Calendar lCal = Calendar.getInstance();
lCal.setTime(pDate);
int lYear = lCal.get(Calendar.YEAR);
int lMonth = lCal.get(Calendar.MONTH) + 1;
int lDay = lCal.get(Calendar.DATE);
int a = (14 - lMonth) / 12;
int y = lYear + 4800 - a;
int m = lMonth + 12 * a - 3;
return lDay + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045;
}
Instant.now().getEpochSecond() // The number of seconds from the Java Epoch of 1970-01-01T00:00:00Z.
Wie bereits erwähnt, kann eine 32-Bit Ganzzahl nicht groß genug sein, um die Anzahl der Sekunden aus der Epoche (Anfang 1970 in UTC) und jetzt zu berücksichtigen. Sie benötigen 64-Bit eine Ganzzahl (ein long
-Primitiv oder Long
-Objekt).
Bei den anderen Antworten werden alte Datums-/Zeitklassen verwendet. Sie wurden durch die Java.time-Klassen ersetzt.
Die Klasse Instant
repräsentiert einen Moment auf der Zeitachse in [~ # ~] utc [~ # ~] mit einer Auflösung von Nanosekunden .
Instant now = instant.now() ;
Sie können die Anzahl der Millisekunden seit der Epoche abfragen. Beachten Sie, dass dies einen Datenverlust bedeutet, der Nanosekunden auf Millisekunden verkürzt.
long millisecondsSinceEpoch = now.toEpochMilli() ;
Wenn Sie die Anzahl der Nanosekunden seit Epoch möchten, müssen Sie ein bisschen rechnen, da die Klasse seltsamerweise keine toEpochNano
-Methode hat. Beachten Sie, dass L
an die Milliarde angehängt wurde, um die Berechnung als 64-Bit-Ganzzahlen zu provozieren.
long nanosecondsSinceEpoch = ( instant.getEpochSecond() * 1_000_000_000L ) + instant.getNano() ;
Am Ende der Frage wird jedoch eine 10-stellige Zahl abgefragt. Ich vermute, das bedeutet eine Zählung von ganzen Sekunden seit der Zeit vom 1970-01-01T00: 00: 00. Dies wird allgemein als Unix Time oder Posix Time bezeichnet.
Wir können das Instant
für diese Nummer abfragen. Dies bedeutet wiederum einen Datenverlust, wenn ein Sekundenbruchteil, den dieses Objekt enthalten kann, abgeschnitten wird.
long secondsSinceEpoch = now.getEpochSecond() ; // The number of seconds from the Java Epoch of 1970-01-01T00:00:00Z.
Das Java.time Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen das lästige alte Legacy Datum-Zeit-Klassen wie Java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time -Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration nach die Java.time Klassen.
Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Die Spezifikation lautet JSR 310 .
Sie können Java.time Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie einen JDBC-Treiber , der mit JDBC 4.2 oder höher kompatibel ist. Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für Java.sql.*
Klassen.
Woher bekommen Sie die Java.time-Klassen?
Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval
, YearWeek
, YearQuarter
und more .
Ich habe das gelöst, wie unten gezeigt:
long year = calendar.get(Calendar.YEAR);
long month = calendar.get(Calendar.MONTH) + 1;
long day = calendar.get(Calendar.DAY_OF_MONTH);
long calcDate = year * 100 + month;
calcDate = calcDate * 100 + day;
System.out.println("int: " + calcDate);
Auf meinem Java 7 ist die Ausgabe anders:
Integer : 1293732698
Long : 1345618496346
Long date : Wed Aug 22 10:54:56 MSK 2012
Int Date : Fri Jan 16 02:22:12 MSK 1970
das ist ein erwartetes Verhalten.
Es ist nicht möglich, das aktuelle Datum in Millisekunden als Ganzzahl (10-stellige Zahl) anzuzeigen, da das letzte mögliche Datum Sun Apr 26 20:46:39 MSK 1970
ist
Date d = new Date(9999_9999_99L);
System.out.println("Date: " + d);
Date: Sun Apr 26 20:46:39 MSK 1970
Sie können die Anzeige in Sekunden/Minuten in Betracht ziehen.
Java Date
in int
Umwandlung:
public static final String DATE_FORMAT_INT = "yyyyMMdd";
public static Integer getDateInt(Date date) {
if (isNull(date)) {
throw new IllegalArgumentException("Date must not be NULL");
}
return parseInt(format(date, DATE_FORMAT_INT));
}
Möglicherweise können Sie nicht, Long ist ein höherer Datentyp als Ganzzahl.
oder dieser Link könnte Ihnen helfen
http://www.velocityreviews.com/forums/t142373-convert-date-to-integer-and-back.html
Versuche dies
Calendar currentDay= Calendar.getInstance();
int currDate= currentDay.get(Calendar.DATE);
int currMonth= currentDay.get(Calendar.MONTH);
int currYear= currentDay.get(Calendar.YEAR);
System.out.println(currDate + "-" + currMonth + "-" + currYear);
eine alternative Möglichkeit mit LocalDate.
LocalDate today = LocalDate.now();
int currentDate= today.getDayOfMonth();
int currentMonth= today.getMonthValue();
int currentYear= today.getYear()
Ihr Problem liegt an getTime () . es kommt immer wieder zurück.
Gibt die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT zurück, die von diesem Date-Objekt dargestellt wird.
Da der maximale ganzzahlige Wert kleiner als der Rückgabewert von getTime()
ist, zeigt das Warum Ein falsches Ergebnis an.