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:
CultureInfo
Implementa 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' IFormatProvider
interfaccia è normalmente implementata per te da una 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 delle impostazioni cultura da una cultura. I due oggetti cultura comunemente disponibili per i quali è IFormatProvider
possibile eseguire query sono:
Il modo in cui normalmente funzionerebbe è che chiedi IFormatProvider
a te di darti un DateTimeFormatInfo
oggetto:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
C'è anche la consapevolezza che qualsiasi IFormatProvider
interfaccia è probabilmente implementata da una classe che discende CultureInfo
o 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 DateTimeFormatInfo
da unIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Per ottenere un NumberFormatInfo
da unIFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Il valore di IFormatProvider
è che crei i tuoi oggetti culturali. Finché implementano IFormatProvider
e 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 LordsNameFormatInfo
classe personalizzata di viaggiare all'interno di un fileIFormatProvider
e puoi preservare l'idioma.
In realtà non avrai mai bisogno di chiamare il GetFormat
metodo diIFormatProvider
te stesso.
Ogni volta che ne hai bisogno IFormatProvider
puoi passare un 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 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.InvariantCulture
posto di CultureInfo.CurrentCulture
?
null
impostazione predefinita CultureInfo.CurrentCulture
. Vedi la chiamata nella fonte di riferimento , se segui la catena di chiamate, il null alla fine viene sostituito con DateTimeFormatInfo.CurrentInfo
che è equivalente a ciò che CultureInfo.CurrentCulture
produce.
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ì.
IFormatProvider
non 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:
NumberFormatInfo
classe, 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 NumberFormatInfo
oggetto e utilizzate nelle operazioni di formattazione numerica, vedere Stringhe di formato numerico standard e Stringhe di formato numerico personalizzate.DateTimeFormatInfo
classe, 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.CultureInfo
classe, che rappresenta una cultura particolare. Il relativo GetFormat
metodo restituisce un oggetto NumberFormatInfo
o una specifica delle impostazioni cultura DateTimeFormatInfo
, a seconda che l' CultureInfo
oggetto 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.