2010-09-14 20 views
21

¿Cuál es el equivalente de Java de DateTime.Ticks en C#?C# DateTime.Ticks equivalente en Java

DateTime dt = new DateTime(2010, 9, 14, 0, 0, 0); 
Console.WriteLine("Ticks: {0}", dt.Ticks); 

¿Cuál será el equivalente al código mencionado anteriormente en Java?

Respuesta

35

Bueno, java.util.Date/Calendar suficiente precisión a la milésima de segundo:

Calendar calendar = Calendar.getInstance();  
calendar.set(Calendar.MILLISECOND, 0); // Clear the millis part. Silly API. 
calendar.set(2010, 8, 14, 0, 0, 0); // Note that months are 0-based 
Date date = calendar.getTime(); 
long millis = date.getTime(); // Millis since Unix epoch 

Eso es el equivalente más cercano efectiva. Si necesita convertir entre un valor de .NET ticks y un Date/Calendar, básicamente necesita realizar escalas (ticks a millis) y compensar (del 1 de enero de 1AD al 1 de enero de 1970).

Las API incorporadas de fecha y hora de Java son bastante desagradables. Yo personalmente recomendaría que use Joda Time en su lugar. Si pudiera decir lo que realmente está tratando de hacer, podemos ayudarlo más.

EDIT: Bueno, aquí hay algunos ejemplos de código:

import java.util.*; 

public class Test { 

    private static final long TICKS_AT_EPOCH = 621355968000000000L; 
    private static final long TICKS_PER_MILLISECOND = 10000; 

    public static void main(String[] args) { 
     long ticks = 634200192000000000L; 

     Date date = new Date((ticks - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND); 
     System.out.println(date); 

     TimeZone utc = TimeZone.getTimeZone("UTC"); 
     Calendar calendar = Calendar.getInstance(utc); 
     calendar.setTime(date); 
     System.out.println(calendar); 
    } 
} 

Tenga en cuenta que este construye una fecha/Calendario representa el UTC instante de 09.14.2019. La representación de .NET es algo confusa: puede crear dos valores de DateTime que son los mismos excepto por su "tipo" (pero por lo tanto representan instantes diferentes) y ellos afirmarán que son iguales. Es un poco de un desastre :(

+0

En mi escenario actual que había ahorrado valor calculado garrapatas en C#; ahora lo que quiero es leer ese valor de tilde y obtener la misma fecha en Java. –

+1

@Asoo: Bien. Caminando para trabajar en el código ATM en veinte minutos. Básicamente divide por tics por milisegundo y resta una compensación. También debe tener en cuenta las compensaciones de la zona horaria. –

+0

Gracias @Skeet .... Pero si quiero calcular los ticks en Java y leerlos en C# ... probé esto pero no da el mismo valor: TimeZone utc = TimeZone.getTimeZone ("UTC"); Calendar calendar = Calendar.getInstance (utc); calendar.set (2010,8,14,0,0,0); System.out.println (calendar.getTimeInMillis() * TICKS_PER_MILLISECOND + TICKS_AT_EPOCH); –

8

System.nanoTime() le da nanosegundos en Java (desde 1,6). Usted todavía tendrá que cambiar/cambiar la escala, pero se perderá ninguna precisión.

+0

nanoTime no tiene nada que ver con el tiempo del reloj, lo que significa que no se puede convertir o comparar con Ticks de .net DateTime. Aquí hay una cita de javadoc: este método solo se puede usar para medir el tiempo transcurrido y no está relacionado con ninguna otra noción del sistema o la hora del reloj de pared. El valor devuelto representa nanosegundos desde algún tiempo fijo pero arbitrario (tal vez en el futuro, por lo que los valores pueden ser negativos). – Stas

12

En Java es decir:

long TICKS_AT_EPOCH = 621355968000000000L; 
long tick = System.currentTimeMillis()*10000 + TICKS_AT_EPOCH; 
+1

esa es la respuesta ... gracias –

0

Convertir .Net garrapatas a Millis en uso de java esto:

static final long TICKS_PER_MILLISECOND = 10000; 
long ticks = 450000000000L; // sample tick value 
long millis = (ticks/TICKS_PER_MILLISECOND); 
1

Base sobre Jon Skeet he desarrollado esta clase

import java.util.Calendar; 
import java.util.Date; 

public class DateHelper { 

    private static final long TICKS_AT_EPOCH = 621355968000000000L; 
    private static final long TICKS_PER_MILLISECOND = 10000; 

    public static long getUTCTicks(Date date){ 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 

     return (calendar.getTimeInMillis() * TICKS_PER_MILLISECOND) + TICKS_AT_EPOCH; 

    } 

    public static Date getDate(long UTCTicks){ 

     return new Date((UTCTicks - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND); 

    } 

} 

funciona para mí