Conversia Data curentă în număr întreg (Programare, Java, Data)

Bathakarai a intrebat.

Vreau să convertesc data curentă în valoare întreagă. În mod implicit, se returnează long. Când încerc să convertesc long în întreg, iar apoi convertesc valoarea întreagă în dată, se afișează data din 1970,

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

rezultatul este următorul:

Integer : 1292838124
Long : 1345617601771
Long date : Wed Aug 22 12:10:01 IST 2012
Int Date : Fri Jan 16 04:37:18 IST 1970

Cineva mă poate ajuta, vă rog, cum să convertesc data curentă în număr întreg (număr de 10 cifre)?

Comentarii

  • o/p este : Integer : 1293630553, Long : 1345618394201, Long date : Wed Aug 22 12:23:14 IST 2012, Int Date : Fri Jan 16 04:50:30:30 IST 1970 –  > Por Nandkumar Tekale.
  • Cred că ați dat un rezultat greșit în întrebare –  > Por Nandkumar Tekale.
  • Îmi pare rău pentru greșeala mea… Acum am schimbat-o –  > Por Bathakarai.
  • Este necesar numărul întreg pentru că o operațiune jdbc utilizează preparedStatement.setInt(aInt)? –  > Por Brian.
  • În legătură cu: Turnarea în siguranță de la long la int în Java –  > Por Ole V.V.V..
12 răspunsuri
Utilizator linux shonky

Problema este că un Integer nu este suficient de mare pentru a stoca o dată curentă, trebuie să utilizați un Long.

Data este stocată intern ca număr de milisecunde de la 1/1/1970.

Valoarea maximă a Integer este 2147483648, în timp ce numărul de milisecunde din 1970 este în prezent de ordinul 1345618537869

Dacă se introduce valoarea maximă a numărului întreg într-o dată, se obține luni, 26 ianuarie 1970.

Editare: Codul pentru a afișa împărțirea la 1000 conform comentariului de mai jos:

    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

Comentarii

  • Mulțumesc shonky, accept răspunsul tău. Dar cerința mea este de a menține doar numere întregi, nu lungi… Există vreo altă modalitate de a îndeplini cerința mea. –  > Por Bathakarai.
  • Dacă sunteți dispus să trăiți cu o rezoluție de o secundă (ați pierde componenta de milisecunde a datei), atunci ați putea împărți cu 1000 înainte de a stoca numărul întreg. Și înmulțiți pentru a converti înapoi. Cu toate acestea, ar avea o durată de viață limitată (un fel de problemă Y2K) – până în 2038. –  > Por utilizator de linux shonky.
  • Am adăugat cod la răspunsul meu pentru a demonstra sugestia de mai sus –  > Por utilizator de linux shonky.
  • FYI, numărarea secundelor întregi de la începutul anului 1970 UTC, ignorând secundele bisecte, este cunoscută sub numele de Ora Unix. –  > Por Basil Bourque.
KG2289

Pentru a obține data curentă sub formă de număr întreg (număr de 10 cifre), trebuie să împărțiți long-ul returnat de new Date().getTime() la 1000.

Aceasta va fi în intervalul int și este valabilă până la 18 ian 2038.

Rudy

Dacă aveți nevoie doar de un număr întreg reprezentând zilele scurse de la 1 ianuarie 1970, puteți încerca acestea:

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

Mai scurt, dar mai puțin lizibil (puțin mai rapid?):

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

Sper că vă ajută.

EDIT: Acest lucru ar putea funcționa până la Fri Jul 11 01:00:00 CET 5881580

s_bei

Aveți nevoie de ceva de genul acesta(fără timp)?

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

Comentarii

  • @Stefan Vă mulțumesc pentru soluție. Dar poate u vă rog să explicați ce se întâmplă aici. –  > Por Droidme.
Basil Bourque

tl;dr

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

Detalii

Așa cum au spus și alții, un 32 de biți nu poate conține un număr suficient de mare pentru numărul de secunde de la epoca (începutul anului 1970 în UTC) și până în prezent. Aveți nevoie de 64 de biți întregi (un long primitiv sau Long obiect).

java.time

Celelalte răspunsuri folosesc clasele vechi de date-timp moștenite. Acestea au fost înlocuite de clasele java.time.

Instant reprezintă un moment pe linia timpului în UTC cu o rezoluție de nanosecunde.

Instant now = instant.now() ;

Se poate interoga pentru a afla numărul de milisecunde scurse de la epocă. Atenție, acest lucru înseamnă o pierdere de date, trunchierea nanosecundelor în milisecunde.

long millisecondsSinceEpoch = now.toEpochMilli() ;

Dacă doriți un număr de nanosecunde de la epoca, va trebui să faceți un pic de matematică, deoarece în mod ciudat, clasa nu are un element toEpochNano metodă. Rețineți că L atașat la miliard pentru a provoca calculul ca numere întregi lungi pe 64 de biți.

long nanosecondsSinceEpoch = ( instant.getEpochSecond() * 1_000_000_000L ) + instant.getNano() ;

Secunde întregi de la începutul epocii

Dar la sfârșitul întrebării se cere un număr de 10 cifre. Bănuiesc că asta înseamnă un număr de întregi secunde întregi de la epoca 1970-01-01T00:00:00:00. Acest lucru se numește în mod obișnuit Timp Unix sau Posix Time.

Putem să interogăm Instant pentru acest număr. Din nou, acest lucru înseamnă o pierdere de date prin trunchierea oricărei fracțiuni de secundă pe care acest obiect o poate conține.

long secondsSinceEpoch = now.getEpochSecond() ;  // The number of seconds from the Java epoch of 1970-01-01T00:00:00Z.

Despre java.time

java.time este încorporat în Java 8 și în versiunile ulterioare. Aceste clase înlocuiesc vechea și problematică moștenire clase de date-timp, cum ar fi java.util.Date, , Calendar, , , & SimpleDateFormat.

Adresa Joda-Time care se află acum în modul de întreținere, , recomandă migrarea la java.time clase.

Pentru a afla mai multe, consultați pagina Tutorialul Oracle. Și căutați în Stack Overflow pentru multe exemple și explicații. Specificația este JSR 310.

Puteți schimba java.time direct cu baza de date. Utilizați un driver JDBC compatibil cu JDBC 4.2 sau o versiune ulterioară. Nu este nevoie de șiruri de caractere, nu este nevoie de java.sql.* clase.

De unde se pot obține clasele java.time?

  • Java SE 8, , Java SE 9, , Java SE 10, , Java SE 11, , și ulterior – Parte a API Java standard cu o implementare la pachet.
    • Java 9 adaugă câteva caracteristici și corecturi minore.
  • Java SE 6 și Java SE 7
  • Android
    • Versiunile ulterioare ale Android includ în pachet implementări ale funcției java.time clase.
    • Pentru Android mai devreme (<26), se utilizează ThreeTenABP adaptează ThreeTen-Backport (menționat mai sus). A se vedea Cum se utilizează ThreeTenABP….

Site-ul ThreeTen-Extra extinde java.time cu clase suplimentare. Acest proiect este un teren de testare pentru posibilele viitoare adăugiri la java.time. Puteți găsi aici câteva clase utile, cum ar fi Interval, , YearWeek, , YearQuarter, , și mai multe.

Zamir García

Am rezolvat acest lucru așa cum se arată mai jos:

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

Comentarii

  • Această întrebare a fost deja rezolvată și, din moment ce este veche de peste 2 ani, nu pare a fi un motiv pentru a adăuga un alt răspuns. –  > Por mbomb007.
  • Acest răspuns nu răspunde la întrebare. Întrebarea a întrebat cum se poate încadra un număr într-o int în loc de un long. Răspunsul corect acceptat explică faptul că nu este posibil. –  > Por Basil Bourque.
Abhishek

Încearcă asta

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

o modalitate alternativă folosind LocalDate.

LocalDate today = LocalDate.now();
int currentDate= today.getDayOfMonth();
int currentMonth= today.getMonthValue();
int currentYear= today.getYear()

Comentarii

  • Vă mulțumim că ați dorit să contribuiți. Mi-e teamă că ați înțeles greșit întrebarea (sau eu am înțeles-o). Cel care întreabă vrea să reprezinte momentul actual în timp ca fiind un număr întreg. Nu trei numere întregi pentru ziua lunii, luna și anul. De asemenea Calendar clasa este de mult depășită și prost concepută, nu mai este recomandată. Și, de asemenea, primim 7 pentru lună, unde majoritatea s-ar aștepta la 8 în august. –  > Por Ole V.V..
  • poate că am înțeles greșit întrebarea. Iar în ceea ce privește clasa Calendar să fie depreciată, tocmai am descoperit această problemă astăzi și am încercat o modalitate alternativă folosind LocalDate. LocalDate today = LocalDate.now(); int currentDate= today.getDayOfMonth(); int currentMonth= today.getMonthValue(); int currentYear= today.getYear(); –  > Por Abhishek.
Sumit Singh

Problema dvs. se datorează getTime() . acesta returnează întotdeauna următoarele.

Returnează numărul de milisecunde de la 1 ianuarie 1970, 00:00:00:00 GMT, reprezentat de acest obiect Date.

Deoarece valoarea maximă a numărului întreg este mai mică decât valoarea returnată de către getTime() de aceea se afișează un rezultat greșit.

khachik

Pe Java 7, rezultatul este diferit:

Integer : 1293732698
Long : 1345618496346
Long date : Wed Aug 22 10:54:56 MSK 2012
Int Date : Fri Jan 16 02:22:12 MSK 1970

care este un comportament așteptat.

Este imposibil să afișați data curentă în milisecunde ca un număr întreg (număr de 10 cifre), deoarece ultima dată posibilă este Sun Apr 26 20:46:39 MSK 1970:

Date d = new Date(9999_9999_99L);
System.out.println("Date: " + d);

Date: Sun Apr 26 20:46:39 MSK 1970

Poate doriți să luați în considerare afișarea în secunde/minute.

imhardik

Probabil că nu se poate, Long este un tip de date mai mare decât Integer.

sau acest link ar putea să vă ajute

http://www.velocityreviews.com/forums/t142373-convert-date-to-integer-and-back.html

Comentarii

  • Vă rugăm să nu includeți „semnături” sau linkul site-ului dvs. în răspunsurile dvs. Puteți pune aceste informații în profilul dvs. –  > Por Andrew Barber.
B9JFH

Simplu într-adevăr creați o variabilă lungă care reprezintă o dată de început implicită pentru programul dvs. obțineți data într-o altă variabilă lungă. apoi deduceți data de început lungă și convertiți-o într-un număr întreg voilaPentru a citi și converti înapoi doar adăugați mai degrabă decât să scădeți. evident, acest lucru depinde de cât de mare este intervalul de date de care aveți nevoie.

Atequer Rahman

Java Date la int Java:

public static final String DATE_FORMAT_INT = "yyyyMMdd";

public static String format(Date date, String format) {
    return isNull(date) ?  
    null : new SimpleDateFormat(format).format(date);
}

public static Integer getDateInt(Date date) {
    if (isNull(date)) {
        throw new IllegalArgumentException("Date must not be NULL");
    }

    return parseInt(format(date, DATE_FORMAT_INT));
}

Tags:,