net militar milisegundos larga hora formato fecha dar c# .net datetime

milisegundos - hora militar c#



Cómo truncar milisegundos de un.NET DateTime (13)

2 Métodos de extensión para las soluciones mencionadas anteriormente.

public static bool LiesAfterIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind) { DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind); compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind); return thisDate > compareDate; } public static bool LiesAfterOrEqualsIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind) { DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind); compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind); return thisDate >= compareDate; }

uso:

bool liesAfter = myObject.DateProperty.LiesAfterOrEqualsIgnoringMilliseconds(startDateTime, DateTimeKind.Utc);

Estoy tratando de comparar una marca de tiempo de una solicitud entrante a un valor almacenado de la base de datos. SQL Server, por supuesto, mantiene cierta precisión de milisegundos en el tiempo, y cuando se lee en un .NET DateTime, incluye esos milisegundos. La solicitud entrante al sistema, sin embargo, no ofrece esa precisión, por lo que simplemente necesito soltar los milisegundos.

Siento que me estoy perdiendo algo obvio, pero no he encontrado una manera elegante de hacerlo (C #).


A veces desea truncarse en algo basado en el calendario, como el año o el mes. Aquí hay un método de extensión que te permite elegir cualquier resolución.

public enum DateTimeResolution { Year, Month, Day, Hour, Minute, Second, Millisecond, Tick } public static DateTime Truncate(this DateTime self, DateTimeResolution resolution = DateTimeResolution.Second) { switch (resolution) { case DateTimeResolution.Year: return new DateTime(self.Year, 1, 1, 0, 0, 0, 0, self.Kind); case DateTimeResolution.Month: return new DateTime(self.Year, self.Month, 1, 0, 0, 0, self.Kind); case DateTimeResolution.Day: return new DateTime(self.Year, self.Month, self.Day, 0, 0, 0, self.Kind); case DateTimeResolution.Hour: return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerHour)); case DateTimeResolution.Minute: return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMinute)); case DateTimeResolution.Second: return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerSecond)); case DateTimeResolution.Millisecond: return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMillisecond)); case DateTimeResolution.Tick: return self.AddTicks(0); default: throw new ArgumentException("unrecognized resolution", "resolution"); } }


Aquí hay un método de extensión basado en una respuesta anterior que le permitirá truncar en cualquier resolución ...

Uso:

DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond); DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute)

Clase:

public static class DateTimeUtils { /// <summary> /// <para>Truncates a DateTime to a specified resolution.</para> /// <para>A convenient source for resolution is TimeSpan.TicksPerXXXX constants.</para> /// </summary> /// <param name="date">The DateTime object to truncate</param> /// <param name="resolution">e.g. to round to nearest second, TimeSpan.TicksPerSecond</param> /// <returns>Truncated DateTime</returns> public static DateTime Truncate(this DateTime date, long resolution) { return new DateTime(date.Ticks - (date.Ticks % resolution), date.Kind); } }


En lugar de perder los milisegundos que se comparan, ¿por qué no comparar la diferencia?

DateTime x; DateTime y; bool areEqual = (x-y).TotalSeconds == 0;

o

TimeSpan precision = TimeSpan.FromSeconds(1); bool areEqual = (x-y).Duration() < precision;


Lo siguiente funcionará para un DateTime que tiene milisegundos fraccionarios y también conserva la propiedad Kind (Local, Utc o Undefined).

DateTime dateTime = ... anything ... dateTime = new DateTime( dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond), dateTime.Kind );

o el equivalente y más corto:

dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));

Esto podría generalizarse en un método de extensión:

public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan) { if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks)); }

que se utiliza de la siguiente manera:

dateTime = dateTime.Truncate(TimeSpan.FromMilliseconds(1)); // Truncate to whole ms dateTime = dateTime.Truncate(TimeSpan.FromSeconds(1)); // Truncate to whole second dateTime = dateTime.Truncate(TimeSpan.FromMinutes(1)); // Truncate to whole minute ...


Menos obvio pero más de 2 veces más rápido:

// 10000000 runs DateTime d = DateTime.Now; // 484,375ms d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond); // 1296,875ms d = d.AddMilliseconds(-d.Millisecond);


Nuevo método

String Date = DateTime.Today.ToString("dd-MMM-yyyy");

// definir el parámetro de paso de cadena dd-mmm-aaaa return 24-feb-2016

O se muestra en el cuadro de texto

txtDate.Text = DateTime.Today.ToString("dd-MMM-yyyy");

// poner en PageonLoad


Para redondear al segundo:

dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)

Reemplace con TicksPerMinute para redondear al minuto.

Si su código es sensible al rendimiento, tenga cuidado con

new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)

Mi aplicación estaba gastando el 12% del tiempo de CPU en System.DateTime.GetDatePart .


Respecto a la respuesta de Diadistis. Esto funcionó para mí, excepto que tuve que usar Piso para eliminar la parte fraccionaria de la división antes de la multiplicación. Asi que,

d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

se convierte en

d = new DateTime(Math.Floor(d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

Habría esperado que la división de dos valores Largos diera como resultado un Largo, eliminando así la parte decimal, pero lo resuelve como un Doble dejando el mismo valor exacto después de la multiplicación.

Eppsy


Sencillo...

//Remove milliseconds DateTime date = DateTime.Now; date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss", null);

Y más...

//Remove seconds DateTime date = DateTime.Now; date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm"), "yyyy-MM-dd HH:mm", null); //Remove minutes DateTime date = DateTime.Now; date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH"), "yyyy-MM-dd HH", null); //and go on...


DateID.Text = DateTime.Today.ToShortDateString(); Use ToShortDateString() //Date 2-02-2016 Use ToShortDateString() // Time

Y por el uso de

ToLongDateString() // its show 19 February 2016.

:PAG


DateTime d = DateTime.Now; d = d.AddMilliseconds(-d.Millisecond);


var date = DateTime.Now; date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind);