2010-11-05 20 views
12

Estoy tratando de escribir una función que convierta una instancia de DateTime.Now a la cantidad de segundos que representa para que pueda compararla con otra instancia de DateTime. Esto es lo que tengo actualmente:Convertir DateTime.Now a Segundos

public static int convertDateTimeToSeconds(DateTime dateTimeToConvert) 
    { 
     int secsInAMin = 60; 
     int secsInAnHour = 60 * secsInAMin; 
     int secsInADay = 24 * secsInAnHour; 
     double secsInAYear = (int)365.25 * secsInADay; 

     int totalSeconds = (int)(dateTimeToConvert.Year * secsInAYear) + 
         (dateTimeToConvert.DayOfYear * secsInADay) + 
         (dateTimeToConvert.Hour * secsInAnHour) + 
         (dateTimeToConvert.Minute * secsInAMin) + 
         dateTimeToConvert.Second; 

     return totalSeconds; 
    } 

Soy consciente de que estoy truncar el cálculo de segundos en un año, pero no necesito mis cálculos para ser precisos. Realmente estoy buscando saber si el método que estoy usando para calcular los segundos es correcto.

¿Alguien tiene algo que pueda calcular mejor los segundos dados desde un objeto DateTime?

Además, ¿Debería el tipo de retorno ser int64 si estoy codificando en C# si voy a calcular todos los segundos desde 0 AD?

+2

Disculpa si me están molestando, pero ¿por qué estás comparando los segundos en lugar de las herramientas de cálculo de fechas incorporadas? – Marko

+0

Estoy tratando de restar una variable que es un entero dado en segundos a partir de uno de los dos objetos mencionados anteriormente. – AndHeCodedIt

Respuesta

24

El tipo DateTime apoya comparison operators:

if (dateTimeA > dateTimeB) 
{ 
    ... 

Esto también funciona para DateTime valores devueltos por DateTime.AddSeconds:

if (dateTimeA.AddSeconds(42) > dateTimeB) 
{ 
    ... 

Si realmente desea que el número de segundos que ha transcurrido desde 01/01/0001 00:00:00, puede calcular la diferencia entre la t wo valores de DateTime. El TimeSpan valor resultante tiene una propiedad TotalSeconds:

double result = DateTime.Now.Subtract(DateTime.MinValue).TotalSeconds; 
+0

+1 aquí, utilicé este. Gracias por la respuesta rápida. – AndHeCodedIt

5

Si el propósito es encontrar el número de segundos entre dos fechas, que sería mucho mejor usar el objeto TimeSpan.

TimeSpan span = date2 - date1; 
double seconds = span.TotalSeconds; 
+0

Precaución: desea TimeSpan.TotalSeconds, no TimeSpan.Seconds – dtb

+0

Utilice TotalSeconds, no segundos. Los segundos representan el resto de segundos una vez que se factorizan los días, horas, minutos, etc. ... – rein

+0

Gracias; fijo. Si estaba mezclado y pensando que las funciones "totales" devolvían la cantidad de unidades enteras que había, en lugar de incluir cualquier fracción de esas unidades. – GendoIkari

4

Si desea comparar 2 objetos DateTime, ¿por qué simplemente no utiliza los operadores proporcionados? http://msdn.microsoft.com/en-us/library/aa326723%28v=VS.71%29.aspx

DateTime a, b; 
if (a > b) //a is after b 
+0

¿funcionará esto si (a.AddSeconds> b)? La razón por la que pregunto es porque tengo un tiempo de memoria intermedia que tendría que restar de uno de los dos objetos. El tiempo de búfer está en segundos. – AndHeCodedIt

+2

Sí, puede hacer esto: if DateTime.Now.AddSeconds (10)> otherDateTime – rein

+0

+1 Esta es la implementación que voy a utilizar. – AndHeCodedIt

3

me gustaría utilizar la clase TimeSpan para obtener la diferencia exacta entre dos instancias de fecha y hora. Aquí está un ejemplo:

DateTime dt1 = DateTime.Now; 
    DateTime dt2 = new DateTime(2003,4,15); 
    TimeSpan ts = dt1.Subtract(dt2); 

vez que el valor TimeSpan (ts, en el fragmento de código anterior) está disponible, se puede examinar sus valores para convertir correctamente el TimeSpan a un número determinado de segundos.

+2

Una trampa para asegurarse de usar ts.TotalSeconds que convierte el TimeSpan en segundos en lugar de ts.Segundos, que es solo el componente de segundos. –

6

Realmente no tiene sentido para convertir un objeto DateTime a segundos. Los segundos solo tienen sentido si se trata de un período de tiempo (TimeSpan). En caso de que desee comparar dos fechas para obtener el número de segundos entre ellos:

TimeSpan diff = DateTime.Now - PreviousDateTime; 
double seconds = diff.TotalSeconds; 
3

Suponiendo que realmente necesita para llegar a los segundos para el objeto de fecha y hora, se puede obtener directamente la propiedad "garrapatas" de ella. Estos no están en segundos, pero puedes dividirlos fácilmente por el factor adecuado para convertir los Ticks a segundos. Ver: http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx

Por lo tanto, algo así como:

 DateTime.Now.Ticks/TimeSpan.TicksPerSecond 
2

Usando un intervalo de tiempo para obtener el tiempo transcurrido entre dos DateTime es probablemente el mejor camino a seguir, pero si realmente desea obtener el número de segundos para un DateTime dado que podría hacer algo como lo siguiente:

DateTime dateTimeToConvert = DateTime.Now; 
TimeSpan tsElapsed = dateTimeToConvert - DateTime.MinValue; 
return tsElapsed.TotalSeconds; 

Tenga en cuenta que tsElapsed.TotalSeconds es un doble, no un Int.

Cuestiones relacionadas