valor objects number minimo funcion example array .net

.net - objects - Equivalente de Math.Min & Math.Max para fechas?



math.min javascript (9)

¿Qué tal un método de extensión DateTime ?

public static DateTime MaxOf(this DateTime instance, DateTime dateTime) { return instance > dateTime ? instance : dateTime; }

Uso:

var maxDate = date1.MaxOf(date2);

¿Cuál es la forma más rápida y fácil de obtener el valor Mín (o Máx) entre dos fechas? ¿Hay un equivalente a Math.Min (& Math.Max) para las fechas?

Quiero hacer algo como:

if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) { //not allowed to do this }

Obviamente, el Math.Min anterior no funciona porque son fechas.


Ahora que tenemos LINQ, puede crear una matriz con sus dos valores (DateTimes, TimeSpans, lo que sea) y luego usar el método de extensión .Max ().

var values = new[] { Date1, Date2 }; var max = values.Max();

Se lee bien, es tan eficiente como puede ser Max, y es reutilizable para más de 2 valores de comparación.

Todo el problema a continuación preocuparse por .Kind es un gran problema ... pero evito que nunca trabaje en los tiempos locales, nunca. Si tengo algo importante con respecto a los tiempos, siempre trabajo en UTC, incluso si eso significa más trabajo para llegar allí.


No hay un método incorporado para hacer eso. Puedes usar la expresión:

(date1 > date2 ? date1 : date2)

para encontrar el máximo de los dos.

Puede escribir un método genérico para calcular Min o Max para cualquier tipo (siempre que Comparer<T>.Default esté configurado correctamente):

public static T Max<T>(T first, T second) { if (Comparer<T>.Default.Compare(first, second) > 0) return first; return second; }

Puedes usar LINQ también:

new[]{date1, date2, date3}.Max()


No hay una sobrecarga para los valores de DateTime, pero puede obtener los Ticks valor largo que es lo que contienen los valores, compararlos y luego crear un nuevo valor de DateTime a partir del resultado:

new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))

(Tenga en cuenta que la estructura DateTime también contiene una propiedad Kind , que no se conserva en el nuevo valor. Esto normalmente no es un problema; si compara valores de DateTime de diferentes tipos, la comparación no tiene sentido de todos modos).


Qué tal si:

public static T Min<T>(params T[] values) { if (values == null) throw new ArgumentNullException("values"); var comparer = Comparer<T>.Default; switch(values.Length) { case 0: throw new ArgumentException(); case 1: return values[0]; case 2: return comparer.Compare(values[0],values[1]) < 0 ? values[0] : values[1]; default: T best = values[0]; for (int i = 1; i < values.Length; i++) { if (comparer.Compare(values[i], best) < 0) { best = values[i]; } } return best; } } // overload for the common "2" case... public static T Min<T>(T x, T y) { return Comparer<T>.Default.Compare(x, y) < 0 ? x : y; }

Funciona con cualquier tipo que admita IComparable<T> o IComparable .

En realidad, con LINQ, otra alternativa es:

var min = new[] {x,y,z}.Min();


Si quieres llamarlo más como Math.Max, puedes hacer algo como este cuerpo de expresión muy corta:

public static DateTime Max(params DateTime[] dates) => dates.Max(); [...] var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);


Linq.Min() / Linq.Max() enfoque:

DateTime date1 = new DateTime(2000,1,1); DateTime date2 = new DateTime(2001,1,1); DateTime minresult = new[] { date1,date2 }.Min(); DateTime maxresult = new[] { date1,date2 }.Max();


// Two different dates var date1 = new Date(2013, 05, 13); var date2 = new Date(2013, 04, 10) ; // convert both dates in milliseconds and use Math.min function var minDate = Math.min(date1.valueOf(), date2.valueOf()); // convert minDate to Date var date = new Date(minDate);

http://jsfiddle.net/5CR37/


public static class DateTool { public static DateTime Min(DateTime x, DateTime y) { return (x.ToUniversalTime() < y.ToUniversalTime()) ? x : y; } public static DateTime Max(DateTime x, DateTime y) { return (x.ToUniversalTime() > y.ToUniversalTime()) ? x : y; } }

Esto permite que las fechas tengan diferentes "tipos" y devuelve la instancia que se pasó (no devuelve un nuevo DateTime construido a partir de Ticks o milisegundos).

[TestMethod()] public void MinTest2() { DateTime x = new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc); DateTime y = new DateTime(2001, 1, 1, 1, 1, 1, DateTimeKind.Local); //Presumes Local TimeZone adjustment to UTC > 0 DateTime actual = DateTool.Min(x, y); Assert.AreEqual(x, actual); }

Tenga en cuenta que esta prueba fallaría al este de Greenwich ...