Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Utilizzare le classi nello spazio dei nomi Windows.Globalization.DateTimeFormatting con modelli e schemi personalizzati per visualizzare date e ore esattamente nel formato desiderato.
Introduzione
La classe DateTimeFormatter offre diversi modi per formattare correttamente date e ore per lingue e aree geografiche in tutto il mondo. È possibile usare formati standard per anno, mese, giorno e così via. In alternativa, puoi passare un modello di formato all'argomento formatTemplate del costruttore DateTimeFormatter, come "longdate" o "month day".
Ma quando si desidera un maggiore controllo sull'ordine e sul formato dei componenti dell'oggetto DateTime che si desidera visualizzare, è possibile passare un modello di formato all'argomento formatTemplate del costruttore. Un modello di formato usa una sintassi speciale, che consente di ottenere singoli componenti di un oggetto DateTime , solo il nome del mese o solo il valore dell'anno, ad esempio, per visualizzarli in qualsiasi formato personalizzato scelto. Inoltre, il modello può essere localizzato per adattarsi ad altre lingue e aree geografiche.
Nota Si tratta solo di una panoramica dei modelli di formato. Per una descrizione più completa dei modelli di formato e degli schemi di formato, vedere la sezione Osservazioni della classe DateTimeFormatter.
La differenza tra modelli di formato e schemi di formato
Un modello di formato è una stringa di formato indipendente dalle impostazioni culturali. Pertanto, se si crea un oggetto DateTimeFormatter usando un modello di formato, il formattatore visualizza i componenti di formato nell'ordine corretto per la lingua corrente. Al contrario, un modello di formato è specifico della cultura. Se si costruisce un oggetto DateTimeFormatter usando un modello di formato, il formattatore userà il modello esattamente come specificato. Di conseguenza, uno schema non è necessariamente valido attraverso le culture.
Di seguito viene illustrata questa distinzione con un esempio. Passeremo un semplice modello di formato (non un pattern) al costruttore DateTimeFormatter. Questo è il modello di formato "month day".
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
In questo modo viene creato un formattatore in base al valore della lingua e dell'area geografica del contesto corrente. L'ordine dei componenti in un modello di formato non è importante; il formattatore li visualizza nell'ordine corretto per la lingua corrente. Quindi, visualizza "1 gennaio" per l'inglese (Stati Uniti), "1 janvier" per il francese (Francia) e "1月1日" per il giapponese.
D'altra parte, un modello di formato è specifico della cultura. Accediamo al formato di modello per il nostro modello di template.
IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;
In questo modo si ottengono risultati diversi a seconda del linguaggio di runtime e dell'area. Aree diverse possono usare componenti diversi, in ordini diversi, con o senza caratteri aggiuntivi e spaziatura.
En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"
Nell'esempio precedente, abbiamo immesso una stringa di formato indipendente dalle impostazioni cultura ed è stata restituita una stringa di formato specifica delle impostazioni cultura, che era una funzione della lingua e dell'area geografica che era in vigore quando è stato chiamato dateFormatter.Patterns
. Di conseguenza, se si costruisce un DateTimeFormatter da un modello di formato specifico per la cultura, sarà valido solo per lingue/aree specifiche.
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");
Il formattatore precedente restituisce valori specifici alla cultura per i singoli componenti, inclusi all'interno delle parentesi quadre come {}. Ma l'ordine dei componenti in un modello di formato è invariante. Ottieni esattamente ciò che chiedi, che potrebbe o non essere culturalmente appropriato. Questo formattatore è valido per l'inglese (Stati Uniti), ma non per il francese (Francia) né per il giapponese.
En-US: January 1
Fr-FR: janvier 1 (inappropriate for France; non-standard order)
Ja-JP: 1月1 (inappropriate for Japan; the day symbol 日 is missing)
Inoltre, un modello corretto oggi potrebbe non essere corretto in futuro. I paesi o le aree geografiche possono modificare i sistemi di calendario, che modificano un modello di formato. Windows aggiorna l'output dei formattatori in base ai modelli di formato per supportare tali modifiche. Pertanto, è consigliabile usare solo la sintassi del modello in una o più di queste condizioni.
- Non sei vincolato a un particolare formato di output.
- Non è necessario che il formato segua alcuni standard specifici di una cultura.
- Si intende specificamente che il modello sia invariante tra le culture.
- Si intende localizzare la stringa del modello di formato effettivo.
Ecco un riepilogo della distinzione tra template di formato e schemi di formato.
Modelli di formato, ad esempio "month day"
- Rappresentazione astratta di un formato DateTime che include valori per il mese, il giorno e così via, in qualsiasi ordine.
- È garantito che restituisca un formato standard valido in tutti i valori di area geografica della lingua supportati da Windows.
- Garantisce di fornire una stringa formattata culturalmente appropriata per la lingua e la regione specificate.
- Non tutte le combinazioni di componenti sono valide. Ad esempio, 'dayofweek day' non è valido.
Modelli di formato, ad esempio "{month.full} {day.integer}"
- Stringa ordinata in modo esplicito che esprime il nome completo del mese, seguito da uno spazio e dal giorno in numero, in tale ordine o secondo il modello di formato specifico che specifichi.
- Potrebbe non corrispondere a un formato standard valido per qualsiasi coppia lingua-regione.
- Non è garantito che sia appropriato a livello culturale.
- Qualsiasi combinazione di componenti può essere specificata, in qualsiasi ordine.
Esempi
Si supponga di voler visualizzare il mese e il giorno correnti insieme all'ora corrente, in un formato specifico. Ad esempio, vorresti che gli utenti di lingua inglese degli Stati Uniti vedessero qualcosa di simile:
June 25 | 1:38 PM
La parte della data corrisponde al modello di formato "month day" e la parte dell'ora corrisponde al modello di formato "hour minute". È quindi possibile costruire formattatori per i modelli di formato di data e ora pertinenti e quindi concatenare l'output insieme usando una stringa di formato localizzabile.
var dateToFormat = System.DateTime.Now;
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");
var date = dateFormatter.Format(dateToFormat);
var time = timeFormatter.Format(dateToFormat);
string output = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), date, time);
CustomDateTimeFormatString
è un identificatore di risorsa che fa riferimento a una risorsa localizzabile in un file di risorse (con estensione resw). Per una lingua predefinita dell'inglese (Stati Uniti), questo valore viene impostato su "{0} | {1}" insieme a un commento che indica che "{0}" è la data e "{1}" è l'ora. In questo modo, i traduttori possono modificare gli elementi di formato in base alle esigenze. Ad esempio, possono modificare l'ordine degli elementi se sembra più naturale in una lingua o un'area geografica in cui l'ora precede la data. In alternativa, possono sostituire "|" con un altro carattere separatore.
Un altro modo per implementare questo esempio consiste nell'eseguire una query sui due formattatori per i modelli di formato, concatenarli insieme e quindi costruire un terzo formattatore dal modello di formato risultante.
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");
string dateFormatterPattern = dateFormatter.Patterns[0];
string timeFormatterPattern = timeFormatter.Patterns[0];
string pattern = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), dateFormatterPattern, timeFormatterPattern);
var patternFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter(pattern);
string output = patternFormatter.Format(System.DateTime.Now);