2012-08-22 32 views
17

Quiero convertir la fecha actual en forma de número entero. Por defecto, regresa largo. Cuando intento convertir el entero como número entero, y luego convierto el valor entero a la fecha, significa que muestra la fecha de 1970.Convertir la fecha actual como número entero

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

la voluntad de salida se hace

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

Cualquiera favor me ayude a cabo, cómo convertir fecha actual como número entero (número de 10 dígitos)

+0

O/P es: Entero: 1293630553, larga: 1345618394201, Fecha larga: Mar Ago 22 de 2012 12:23:14 IST, Int Fecha: Vie Ene 16 de 1970 04:50:30 IST –

+0

Creo que dio salida incorrecta en la pregunta –

+0

Disculpe por mi error ... Ahora lo cambio – Bathakarai

Respuesta

30

La cuestión es que un número entero no es grande lo suficiente como para almacenar una fecha actual, necesita usar un Largo.

La fecha se almacena internamente como la cantidad de milisegundos desde 1/1/1970.

El valor máximo entero es 2147483648, mientras que el número de milisegundos desde 1970 se encuentra actualmente en el orden de 1345618537869

Poniendo el valor máximo número entero en un rendimientos fecha lunes 26 de enero de 1970.

Editar: Código para mostrar la división en 1000 de acuerdo con comentarios a continuación:

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 
+0

Gracias shonky, acepto tu respuesta. Pero mi requisito es mantener un número entero no muy largo ... ¿Hay alguna otra manera de cumplir con mi requisito? – Bathakarai

+6

Si está dispuesto a vivir con una resolución de un segundo (perdería el componente de milisegundos de la fecha), podría dividir entre 1000 antes de almacenar el número entero. Y multiplicar para convertir de nuevo. Sin embargo, tendría una vida limitada (una especie de problema del Y2K) - hasta 2038. –

+0

He agregado código a mi respuesta para demostrar la sugerencia anterior –

0

su problema se debe a getTime(). siempre regresa siguiendo.

Devuelve el número de milisegundos desde el 1 de enero de 1970, 00:00:00 GMT representado por este objeto Date.

Debido a que el valor entero máximo es menor que el valor devuelto por getTime() por eso está mostrando resultado erróneo.

4

¿Necesita algo como esto (sin tiempo)?

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

gracias. Has solucionado mi problema. – Ponting

+0

@Stefan Gracias por la solución. Pero ¿puedes explicar qué está pasando aquí? – Droidme

0

En mi Java 7, la salida es diferente:

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

que es un comportamiento esperado.

Es imposible mostrar la fecha actual en milisegundos como un entero (10 dígitos), debido a que la última fecha posible es 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 

Es posible que desee considerar la posibilidad de mostrarla en segundos/minutos.

6

el fin de obtener la fecha actual como número entero (número de 10 dígitos), es necesario dividir el tiempo de regresar de new Date(). GetTime() por 1000.

Esto estará en rango interno y es válido hasta el 18 de enero de 2038.

2

Si sólo necesita un entero que representa los días transcurridos desde el 1 de enero de 1970, se puede probar estos:

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

más corto, pero menos legible (un poco más rápido?):

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

Esperanza esto ayuda.

EDIT: Esto podría trabajar hasta Vie Jul 11 ​​01:00:00 CET 5881580

-1

simple en realidad crear una variable de tiempo que representa una fecha de inicio predeterminada para su programa Obtener la fecha a otra variable de largo. A continuación, deduzca la fecha de inicio larga y conviértala en un entero voila Para leer y convertir solo agregue en lugar de restar. obviamente esto depende de qué tan grande sea el rango de fechas que requiera.

1

He resuelto esto como se muestra a continuación:

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

Esta pregunta ya ha sido resuelta, y desde que tiene más de 2 años, no parece haber una razón para agregar otra respuesta. – mbomb007

+0

Esta respuesta no aborda la cuestión. La pregunta preguntó cómo ajustar el número en un 'int' en lugar de un' long'. La [respuesta correcta aceptada] (http://stackoverflow.com/a/12067775/642706) explica que no es posible. –

+0

gracias por la ayuda – user49557

0

tl; dr

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

detalles

Como otros han dicho, un número entero 32-bit no puede contener un número suficiente de grandes el número de segundos de la época (comienzo de 1970 en UTC) y ahora. Necesita 64-bit entero (una primitiva long o Long objeto).

java.time

Las otras respuestas están utilizando legado clases de fecha y hora de edad. Han sido suplantados por las clases java.time.

La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds.

Instant now = instant.now() ; 

Puede consultar la cantidad de milisegundos desde la época. Tenga cuidado con esto significa una pérdida de datos, truncando nanosegundos a milisegundos.

long millisecondsSinceEpoch = now.toEpochMilli() ; 

Si quieres un recuento de nanosegundos desde el periodo, que se necesitan para hacer un poco de matemáticas como la clase carece de un método extraño toEpochNano. Tenga en cuenta el L agregado a los mil millones para provocar el cálculo como enteros largos de 64 bits.

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

segundos enteros desde el periodo

pero el final de la pregunta pide un número de 10 dígitos. Sospecho que eso significa un conteo de entero segundos desde la época de 1970-01-01T00: 00: 00. Esto se conoce comúnmente como Unix Time o Posix Time.

Podemos interrogar al Instant para obtener este número. De nuevo, esto significa una pérdida de datos con el truncamiento de cualquier fracción de segundo que este objeto pueda contener.

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