wake-up-neo.com

Aktuelles Datum als Ganzzahl konvertieren

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.

23
Bathakarai

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
39

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.

7
KG2289

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

4
Rudy

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;
}
4
Stefan Beike

tl; dr

Instant.now().getEpochSecond()  // The number of seconds from the Java Epoch of 1970-01-01T00:00:00Z.

Einzelheiten

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).

Java.time

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

Ganze Sekunden seit der Epoche

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.

Über Java.time

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 .

2
Basil Bourque

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);
1
Zamir García

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.

0
khachik

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));
}
0
Atequer Rahman

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

0
imhardik

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()
0
Abhishek

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.

0
Sumit Singh