Domanda

Stavo giocando con il metodo Datetime.ParseExact e vuole un IFormatProvider...

Funziona inserendo null, ma cosa fa esattamente?

È stato utile?

Soluzione

In aggiunta alla risposta di Ian Boyd:

Anche CultureInfo implementa questa interfaccia e può essere utilizzato nel vostro caso. Così si potrebbe analizzare una stringa di data francese per esempio; si potrebbe usare

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

Altri suggerimenti

IL IFormatProvider l'interfaccia è normalmente implementata per te da a CultureInfo classe, ad esempio:

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

L'interfaccia è un gateway per una funzione per ottenere un set di dati specifici della cultura da una cultura.I due oggetti cultura comunemente disponibili che an IFormatProvider possono essere richiesti sono:

  • DateTimeFormatInfo
  • NumberFormatInfo

Il modo in cui funzionerebbe normalmente è chiedere a IFormatProvider per darti un DateTimeFormatInfo oggetto:

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

C'è anche la conoscenza interna che any IFormatProvider è probabile che l'interfaccia sia implementata da una classe che discende da CultureInfo, o discende da DateTimeFormatInfo, quindi puoi trasmettere direttamente l'interfaccia:

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);

Ma non farlo

Tutto quel duro lavoro è già stato scritto per te:

Prendere un DateTimeFormatInfo da un IFormatProvider:

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

Prendere un NumberFormatInfo da un IFormatProvider:

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

Il valore di IFormatProvider è che crei i tuoi oggetti culturali.Purché lo implementino IFormatProvider, e restituire gli oggetti richiesti, è possibile ignorare le impostazioni cultura integrate.

Puoi anche usare IFormatProvider per un modo di trasmettere oggetti culturali arbitrari - attraverso il IFormatProvider.Per esempio.il nome di Dio nelle diverse culture

  • Dio
  • Dio
  • Geova
  • Yahweh
  • יהוה
  • אהיה אשר אהיה

Ciò consente la tua personalizzazione LordsNameFormatInfo giro di classe all'interno di un IFormatProvider, e puoi preservare l'idioma.

In realtà non avrai mai bisogno di chiamare GetFormat metodo di IFormatProvider te stesso.

Ogni volta che hai bisogno di un IFormatProvider puoi passare a CultureInfo oggetto:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

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

Nota:Qualsiasi codice viene rilasciato nel pubblico dominio.Nessuna attribuzione richiesta.

Passando NULL come IFormatProvider non è il modo corretto di fare questo. Se l'utente ha una data di custom / formato ora sul proprio PC avrete problemi in analisi e la conversione a stringa. Ho appena risolto un bug per cui qualcuno era passato null come IFormatProvider durante la conversione in stringa.

Invece si dovrebbe usare CultureInfo.InvariantCulture

Sbagliato:

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

corretta:

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

Si può vedere qui http://msdn.microsoft.com/ it-it / library / system.iformatprovider.aspx

vedere la sezione Osservazioni e l'esempio lì.

IFormatProvider fornisce informazioni cultura al metodo in questione. DateTimeFormatInfo implementa IFormatProvider, e ti permette di specificare il formato volete che il vostro data / ora per essere visualizzato in. gli esempi si possono trovare nelle pagine MSDN rilevanti.

MSDN

Il .NET Framework include le seguenti tre implementazioni IFormatProvider predefiniti per fornire informazioni specifiche coltura che viene utilizzato nella formattazione o l'analisi numerica e valori data e ora:

  1. Il NumberFormatInfo classe, che fornisce informazioni che vengono utilizzate per formattare i numeri, come la moneta, separatore delle migliaia, e simboli separatori decimali per una particolare coltura. Per informazioni sulle stringhe di formato predefiniti riconosciuti da un oggetto DateTimeFormatInfo e utilizzati nelle operazioni di formattazione numerico, vedere Stringhe di formato numerico standard e Stringhe di formato numerico personalizzato.
  2. Il CultureInfo classe, che fornisce le informazioni che viene utilizzato per date e orari formato, come ad esempio la data e ora codici di separazione per una cultura particolare o l'ordine e il formato di componenti anno, mese e giorno di una data. Per informazioni sulle stringhe di formato predefiniti riconosciuti da un oggetto GetFormat e utilizzati nelle operazioni di formattazione numerici, vedi formato data e ora standard stringhe e date personalizzato e stringhe Tempo formato.
  3. Il String.Format(IFormatProvider, String, Object[]) classe, che rappresenta una cultura particolare. Il suo metodo di <=> restituisce un <=> o <=> oggetto specifico-cultura, a seconda che l'<=> oggetto viene utilizzato in una formattazione o il funzionamento di analisi che coinvolge numeri o date e gli orari.

Il .NET Framework supporta anche la formattazione personalizzata. Questo in genere comporta la creazione di una classe di formattazione che implementa sia IFormatProvider e ICustomFormatter. Un'istanza di questa classe viene poi passato come parametro a un metodo che esegue un'operazione di formattazione personalizzata, come ad esempio <=>.

Il DateTimeFormatInfo classe implementa questa interfaccia, in modo che permette di controllare la formattazione delle corde datetime.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top