Estaba intentando crear una implementación IFormatProvider
que reconocería cadenas de formato personalizado para objetos DateTime. Aquí está mi aplicación:Cómo crear y usar un IFormatProvider personalizado para DateTime?
public class MyDateFormatProvider : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
{
return this;
}
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if(arg == null) throw new ArgumentNullException("arg");
if (arg.GetType() != typeof(DateTime)) return arg.ToString();
DateTime date = (DateTime)arg;
switch(format)
{
case "mycustomformat":
switch(CultureInfo.CurrentCulture.Name)
{
case "en-GB":
return date.ToString("ddd dd MMM");
default:
return date.ToString("ddd MMM dd");
}
default:
throw new FormatException();
}
}
que estaba esperando para poder utilizarla en el método DateTime.ToString(string format, IFormatProvider provider)
como tal, sino:
DateTime d = new DateTime(2000, 1, 2);
string s = d.ToString("mycustomformat", new MyDateFormatProvider());
En ese ejemplo, se ejecuta en la cultura de Estados Unidos, el resultado es "00cu0Ao00or0aA"
, al parecer porque las cadenas de formato de fecha y hora estándar se están interpretando.
Sin embargo, cuando se utiliza la misma clase de la siguiente manera:
DateTime d = new DateTime(2000, 1, 2);
string s = String.Format(new MyDateFormatProvider(), "{0:mycustomformat}", d);
consigo lo que esperaba, a saber "Sun Jan 02"
que no entienden los diferentes resultados. ¿Alguien podría explicar?
Gracias!
Gracias por la respuesta detallada. Estaba pensando que estaba malinterpretando la interfaz y la implementación esperada, por lo que es bueno saber que es la implementación de DateTime lo que es raro :-) –