2010-01-27 8 views
7

Tengo un cliente que quiere ver la medianoche representada como el final del día anterior.DateTime día que termina 24:00 (medianoche)

Ejemplo

var date = DateTime.Parse("1/27/2010 0:00"); 
Console.WriteLine(date.ToString(<some format>)); 

Display:

1/26/2010 24:00 

creo que esto es válido en la norma ISO 8601. (see this)

¿Hay alguna manera de admitir esto en .NET (sin un feo hack de manipulación de cadenas)?

Respuesta

7

Supongo que necesitará un formateador personalizado para las fechas. Mire las interfaces IFormatProvider y ICustomFormatter.

This y this también pueden ayudar.

+0

Gracias, Lucero. Pensé que estas interfaces podrían ser útiles. (+1) Si esto funciona, publicaré un ejemplo. –

+0

El formateador personalizado funciona con string.Format(), pero ICustomFormatter.Format() nunca se llama cuando se usa date.ToString (new MyFormatter()); –

2

Puede configurar un método de extensión, aunque probablemente el método adecuado sea utilizar IFormatProvider como Lucero suggested. El método de extensión se compararía con la fecha Date property, que devuelve la fecha con el componente horario configurado a medianoche. Sería similar a esto:

public static class Extensions 
{ 
    public static string ToCustomFormat(this DateTime date) 
    { 
     if (date.TimeOfDay < TimeSpan.FromMinutes(1)) 
     { 
      return date.AddDays(-1).ToString("MM/dd/yyyy") + " 24:00"; 
     } 
     return date.ToString("MM/dd/yyyy H:mm"); 
    } 
} 

Entonces llaman usando:

var date = DateTime.Parse("1/27/2010 0:00"); 
Console.WriteLine(date.ToCustomFormat()); 

EDIT: actualizado por los comentarios.

+2

Hay 60,000 milisegundos en ese minuto y este solo funciona con uno de ellos (DateTime.Today representando 0: 00,000 AM) –

+0

@DrJokepu: No estoy seguro de seguirlo. ¿Puedes por favor elaborar? Si la entrada es medianoche según lo indicado por el OP, la comparación debería ser correcta. Si se incluyen milisegundos, como '0: 00: 30', lo anterior devolverá el día actual a menos que esté hecho para verificar las propiedades' Hora' y 'Minuto'. –

+0

Más 1 para el ejemplo. Creo que tienes razón sobre la sugerencia de Lucero. –

Cuestiones relacionadas