Stavo giocando con il metodo Datetime.ParseExact e vuole un IFormatProvider ...
Funziona inserendo null, ma cosa fa esattamente?
Stavo giocando con il metodo Datetime.ParseExact e vuole un IFormatProvider ...
Funziona inserendo null, ma cosa fa esattamente?
Risposte:
In aggiunta alla risposta di Ian Boyd:
CultureInfoImplementa anche questa interfaccia e può essere utilizzata nel tuo caso. Quindi potresti analizzare una stringa di data francese, ad esempio; potresti usare
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)invece, credo - come tale: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);. Rivedi la tua risposta.
L' IFormatProviderinterfaccia è normalmente implementata per te da una CultureInfoclasse, ad esempio:
CultureInfo.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.InvariantCultureCultureInfo.CreateSpecificCulture("de-CA") //German (Canada)L'interfaccia è un gateway per una funzione per ottenere un set di dati specifici delle impostazioni cultura da una cultura. I due oggetti cultura comunemente disponibili per i quali è IFormatProviderpossibile eseguire query sono:
Il modo in cui normalmente funzionerebbe è che chiedi IFormatProvidera te di darti un DateTimeFormatInfooggetto:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
C'è anche la consapevolezza che qualsiasi IFormatProviderinterfaccia è probabilmente implementata da una classe che discende CultureInfoo discende da DateTimeFormatInfo, quindi puoi eseguire il cast dell'interfaccia direttamente:
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);
Tutto quel duro lavoro è già stato scritto per te:
Per ottenere un DateTimeFormatInfoda unIFormatProvider :
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Per ottenere un NumberFormatInfoda unIFormatProvider :
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Il valore di IFormatProviderè che crei i tuoi oggetti culturali. Finché implementano IFormatProvidere restituiscono gli oggetti richiesti, puoi ignorare le impostazioni cultura incorporate.
Puoi anche usare IFormatProvider per passare oggetti cultura arbitrari - attraverso il file IFormatProvider. Ad esempio il nome di dio in culture diverse
Ciò consente alla tua LordsNameFormatInfoclasse personalizzata di viaggiare all'interno di un fileIFormatProvider e puoi preservare l'idioma.
In realtà non avrai mai bisogno di chiamare il GetFormatmetodo diIFormatProvider te stesso.
Ogni volta che ne hai bisogno IFormatProviderpuoi passare un CultureInfooggetto:
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 il IFormatProvider non è il modo corretto per farlo. Se l'utente ha un formato data / ora personalizzato sul proprio PC, si avranno problemi nell'analisi e nella conversione in stringa. Ho appena corretto un bug in cui qualcuno aveva passato null come IFormatProvider durante la conversione in stringa.
Invece dovresti 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);
CultureInfo.InvariantCultureposto di CultureInfo.CurrentCulture?
nullimpostazione predefinita CultureInfo.CurrentCulture. Vedi la chiamata nella fonte di riferimento , se segui la catena di chiamate, il null alla fine viene sostituito con DateTimeFormatInfo.CurrentInfoche è equivalente a ciò che CultureInfo.CurrentCultureproduce.
IFormatProvider fornisce informazioni sulla cultura al metodo in questione. DateTimeFormatInfo implementa IFormatProvider e consente di specificare il formato in cui si desidera visualizzare la data / ora. Gli esempi sono disponibili nelle pagine MSDN pertinenti.
Puoi vedere qui http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Vedere le osservazioni e la sezione di esempio lì.
IFormatProvidernon viene utilizzato IFormatProvider.
Controlla http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx per l'API.
Di MSDN
.NET Framework include le seguenti tre implementazioni IFormatProvider predefinite per fornire informazioni specifiche delle impostazioni cultura utilizzate nella formattazione o nell'analisi di valori numerici e di data e ora:
NumberFormatInfoclasse, che fornisce le informazioni utilizzate per formattare i numeri, come la valuta, il separatore delle migliaia e i simboli del separatore decimale per una determinata lingua. Per informazioni sulle stringhe di formato predefinite riconosciute da un NumberFormatInfooggetto e utilizzate nelle operazioni di formattazione numerica, vedere Stringhe di formato numerico standard e Stringhe di formato numerico personalizzate.DateTimeFormatInfoclasse, che fornisce le informazioni utilizzate per formattare le date e le ore, come i simboli di separazione della data e dell'ora per una determinata lingua o l'ordine e il formato dei componenti anno, mese e giorno di una data. Per informazioni sulle stringhe di formato predefinite riconosciute da un fileDateTimeFormatInfo oggetto e utilizzate nelle operazioni di formattazione numerica, vedere stringhe di formato di data e ora standard e stringhe di formato di data e ora personalizzate.CultureInfoclasse, che rappresenta una cultura particolare. Il relativo GetFormatmetodo restituisce un oggetto NumberFormatInfoo una specifica delle impostazioni cultura DateTimeFormatInfo, a seconda che l' CultureInfooggetto venga utilizzato in un'operazione di formattazione o analisi che coinvolge numeri o date e ore..NET Framework supporta anche la formattazione personalizzata. Ciò implica in genere la creazione di una classe di formattazione che implementa sia IFormatProvider che ICustomFormatter. Un'istanza di questa classe viene quindi passata come parametro a un metodo che esegue un'operazione di formattazione personalizzata, ad esempio String.Format(IFormatProvider, String, Object[]).
La classe DateTimeFormatInfo implementa questa interfaccia, quindi consente di controllare la formattazione delle stringhe DateTime.