2015-08-08 19 views
12

Recentemente ho aggiornato a Windows 10 - e ora vedo alcune modifiche piuttosto inaspettate nell'output di una data quando si utilizza l'identificatore di formato "tt".Output of times (AM/PM) modificato in Windows 10 quando si utilizza DateTime.ToString ("tt")

Ecco alcuni codice che illustra il problema:

using System.IO; 
using System; 
using System.Globalization; 
using System.Threading.Tasks; 

class Program 
{ 
    static void Main() 
    { 
     var cultures = new string[] {null, "en-NZ", "en-US", "en-AU", "en-GB"}; 

      foreach (var culture in cultures) { 
       if (culture != null) { 
        var c = CultureInfo.GetCultureInfo(culture); 
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = c; 
       } 

       DateTime dt = new DateTime(2015, 1, 2, 3, 4, 5, DateTimeKind.Utc); 

       Console.WriteLine("selection: {0} CurrentThread.CurrentCulture.Name: {1} CurrentThread.CurrentUICulture.Name: {2} Value: {3}", 
        culture ?? "ambient", 
        System.Threading.Thread.CurrentThread.CurrentCulture.Name, 
        System.Threading.Thread.CurrentThread.CurrentUICulture.Name, 
        dt.ToString("hhh:mm tt")); 
      } 
    } 
} 

L'uscita nelle versioni precedenti di Windows è stato:

selection: ambient CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ Value: 03:04 a.m. 
selection: en-NZ CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ Value: 03:04 a.m. 
selection: en-US CurrentThread.CurrentCulture.Name: en-US CurrentThread.CurrentUICulture.Name: en-US Value: 03:04 AM 
selection: en-AU CurrentThread.CurrentCulture.Name: en-AU CurrentThread.CurrentUICulture.Name: en-AU Value: 03:04 AM 
selection: en-GB CurrentThread.CurrentCulture.Name: en-GB CurrentThread.CurrentUICulture.Name: en-GB Value: 03:04 am 

e in Windows 10:

selection: ambient (windows 10) CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-US Value: 03:04 a.m. 
selection: en-NZ CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ Value: 03:04 AM 
selection: en-US CurrentThread.CurrentCulture.Name: en-US CurrentThread.CurrentUICulture.Name: en-US Value: 03:04 AM 
selection: en-AU CurrentThread.CurrentCulture.Name: en-AU CurrentThread.CurrentUICulture.Name: en-AU Value: 03:04 AM 
selection: en-GB CurrentThread.CurrentCulture.Name: en-GB CurrentThread.CurrentUICulture.Name: en-GB Value: 03:04 AM 

In entrambi i casi questo codice è stato compilato per il targeting di Visual Studio 2013.Net Framework 4.5

Qualcuno sa perché il comportamento è cambiato - e perché in Windows 10 sembra che l'impostazione di qualsiasi cultura su un thread modifichi specificamente l'output di AM/PM per essere formattato come "AM"/"PM" non quello che viene normalmente emesso per quella cultura?

+0

Il tuo codice funziona correttamente sulla mia macchina Windows10/VS2015/4.5. – vendettamit

+1

Hai installato i file di lingua di Windows 10 per tutte le culture che usi qui? –

+0

Ho tutte le funzionalità linguistiche opzionali installate per en-GB e en-US ... en-AU e en-NZ sono appena fuori dalla scatola (ma li ho configurati come lingue con cui posso leggere e scrivere Windows 10). Questa è sicuramente una regressione nel comportamento che penso - anche se ho capito bene, i dati di CultureInfo sono stati caricati da chiamate interne di Windows, ma provenivano da dati sempre disponibili in windows, ad es.le stesse informazioni che popolano la finestra di dialogo delle impostazioni di data e ora quando passi da un paese all'altro. – Bittercoder

risposta

0

Ho sempre forzato l'uso di ToString("G") quando si modifica DateTime su stringhe con la funzione ToString(). Quindi non ho problemi ad analizzare di nuovo la stringa in DateTime. L'ho provato con la mia applicazione client (ottiene la data & in XML in formato "G" e la analizzo in DateTime) su Windows 7/8/10.

0

Ho anche scoperto che la combinazione di 'en-nz' e aggiornamento di Windows 10 improvvisamente cambia a.m./p.m. a AM/PM.

La differenza è il codice che ho mantenuto l'inoltro su ToShortTimeString() di uscita con a.m./p.m. ma in Windows 10 si trasforma in AM/PM invece trascorro le età cercando di trovare la stringa di informazioni corrette cultura/formato, e sto anche cercando di trovare il locale mancante impostazione sul mio nuovo computer Windows 10 confronta con il mio vecchio computer Windows 7. Ma si scopre che la stessa impostazione locale su diverse versioni di Windows mostra in effetti a.m./p.m.AM/PM in modo diverso.

Setting on my Windows 10 machine And the AM Symbol changed to AM now Setting on a Windows 7 machine in comparison And the AM Symbol is a.m. for the same Windows display language And same setting on Windows 2012 in comparison which confirm that so far only windows 10 are different

anche confermare che DateTimeFormatInfo.AMDesignator per 'en-nz' ora di uscita 'AM' invece di 'a.m.'