2009-02-03 26 views
65

Estaba jugando con el método Datetime.ParseExact, y quiere un proveedor IFormat ...¿Qué hace IFormatProvider?

Funciona la entrada nula, pero ¿qué es exactamente lo que hace?

+3

posible duplicado de [¿Por qué DateTime.ParseExact (String, String, IFormatProvider) necesita IFormatProvider?] (Http://stackoverflow.com/questions/18961520/why-datetime-parseexactstring-string-iformatprovider-need-the- iformatprovide). Votaré para cerrar con uno más nuevo porque está redactado mejor y tiene una mejor respuesta. – nawfal

Respuesta

41

También CultureInfo implementa esta interfaz y se puede utilizar en su caso. Por lo tanto, podría analizar una cadena de fecha francesa, por ejemplo; usted podría utilizar

var ci = new CultureInfo("fr-FR"); 
DateTime dt = DateTime.Parse(yourDateInputString, yourFormatString, ci); 
+2

Parece que ya no hay una sobrecarga que coincida con su ejemplo en .NET Framework 4.6. Debe utilizar 'DateTime.ParseExact (cadena, cadena, IFormatProvider)' en lugar, creo que - como tal: 'DateTime.ParseExact ("20160409 111559", "AAAAMMDD HHmmss", CultureInfo.CurrentCulture)' –

+0

Voy a actualizar la respuesta :) –

1

La clase DateTimeFormatInfo implementa esta interfaz, por lo que le permite controlar el formato de sus cadenas DateTime.

5

IFormatProvider proporciona información cultural del método en cuestión. DateTimeFormatInfo implementa IFormatProvider, y le permite especificar el formato en el que desea que se muestre su fecha/hora. Se pueden encontrar ejemplos en las páginas MSDN relevantes.

14

pasar null como IFormatProvider no es la forma correcta de hacer esto. Si el usuario tiene un formato de fecha/hora personalizado en su PC, tendrá problemas al analizar y convertir a cadena. Acabo de corregir un error por el cual alguien pasó nulo como IFormatProvider al convertir a cadena.

su lugar se debe utilizar CultureInfo.InvariantCulture

incorrecto:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null); 

correcta:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture); 
+2

¿Hay alguna razón por la que deberíamos usar 'CultureInfo.InvariantCulture' en lugar de' CultureInfo.CurrentCulture'? –

+4

InvariantCulture es una cultura especial que está garantizada para existir siempre en cualquier máquina y siempre convertirá y analizará de nuevo a los mismos valores. CurrentCulture es la cultura del hilo actual. Esto puede variar y si no se utiliza la misma cultura para convertir a la cadena y analizar, obtendrá errores de formato ... – Tim

+5

@StephenBooher que pasan en 'null' tome por defecto' CultureInfo.CurrentCulture'. Ver la llamada en la [fuente de referencia] (http://referencesource.microsoft.com/mscorlib/a.html#bfc8add12515d311), si se sigue la cadena de llamadas a lo largo de, la hipótesis nula es reemplazado con el tiempo con [ 'DateTimeFormatInfo.CurrentInfo' ] (http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.currentinfo (v = vs.110) .aspx) que es equivalente a los resultados de 'CultureInfo.CurrentCulture'. –

29

La interfaz IFormatProvider normalmente se implementa para usted por una clase CultureInfo, por ejemplo:

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

la interfaz es una puerta de entrada para una función para obtener un conjunto de datos específicos de la cultura de un cultivo.Los objetos de las dos culturas comúnmente disponibles que un IFormatProvider puede ser consultada en cuenta son:

  • DateTimeFormatInfo
  • NumberFormatInfo

la forma en que normalmente funcionaría se le pide al IFormatProvider para darle un objeto DateTimeFormatInfo:

DateTimeFormatInfo format; 
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo)); 
if (format != null) 
    DoStuffWithDatesOrTimes(format); 

También hay conocimiento interno de que cualquier IFormatProvider interfaz probable es ejecutado por una clase que desciende desde CultureInfo o desciende de DateTimeFormatInfo, por lo que podría poner en la interfaz directa:

CultureInfo info = provider as CultureInfo; 
if (info != null) 
    format = info.DateTimeInfo; 
else 
{ 
    DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo; 
    if (dtfi != null) 
     format = dtfi; 
    else 
     format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo)); 
} 

if (format != null) 
    DoStuffWithDatesOrTimes(format); 

Pero no hacen eso

Todo ese trabajo duro tiene ya han escrito para usted:

para obtener una DateTimeFormatInfo de un IFormatProvider:

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider); 

Para obtener una NumberFormatInfo de un IFormatProvider:

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider); 

El valor de IFormatProvider es que permite crear sus propios objetos de cultivo. Siempre que implementen IFormatProvider y devuelvan los objetos que se les solicitan, puede omitir los cultivos incorporados.

También puede usar IFormatProvider para una forma de pasar objetos de cultivo arbitrarios - a través del IFormatProvider. P.ej. el nombre de Dios en diferentes culturas

  • dios
  • Dios
  • Jehová
  • Yahwe
  • יהוה
  • אהיה אשר אהיה

Esto permite que su viaje en clase personalizada LordsNameFormatInfo lo largo dentro de un IFormatProvider, y puede conservar t el modismo.

En realidad, nunca tendrá que llamar al método GetFormat de IFormatProvider usted mismo.

cada vez que necesite un IFormatProvider se puede pasar un objeto CultureInfo:

DateTime.Now.ToString(CultureInfo.CurrentCulture); 

endTime.ToString(CultureInfo.InvariantCulture); 

transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc")); 

Nota: Cualquier código se libera en el dominio público. No se requiere atribución.

2

Por MSDN

El Marco .NET incluye las siguientes tres implementaciones IFormatProvider predefinidas para proporcionar información específica de la cultura que se utiliza en el formato o analizar los valores numéricos y de fecha y hora:

  1. La clase NumberFormatInfo, que proporciona información que se utiliza para formatear números, como la moneda, el separador de miles y los símbolos de separador decimal para una cultura en particular. Para obtener información acerca de las cadenas de formato predefinidas reconocidas por un objeto NumberFormatInfo y utilizadas en operaciones de formateo numérico, vea Cadenas estándar de formato numérico y cadenas de formato numérico personalizado.
  2. La clase DateTimeFormatInfo, que proporciona información que se utiliza para formatear fechas y horas, como los símbolos separadores de fecha y hora para una cultura particular o el orden y formato de los componentes de año, mes y día de una fecha. Para obtener información acerca de las cadenas de formato predefinidas reconocidas por un objeto DateTimeFormatInfo y utilizadas en operaciones de formateo numérico, vea Cadenas estándar de formato de fecha y hora, y cadenas de formato de fecha y hora personalizadas.
  3. La clase CultureInfo, que representa una cultura particular. Su método GetFormat devuelve un NumberFormatInfo o DateTimeFormatInfo objeto específico de la cultura, dependiendo de si el objeto CultureInfo se utiliza en un formato o operación que implica números o fechas y horas de análisis.

.NET Framework también es compatible con el formato personalizado. Esto generalmente implica la creación de una clase de formato que implementa tanto IFormatProvider como ICustomFormatter. A continuación, se pasa una instancia de esta clase como parámetro a un método que realiza una operación de formateo personalizada, como String.Format(IFormatProvider, String, Object[]).