2015-08-08 21 views
12

Gần đây tôi đã nâng cấp lên cửa sổ 10 - và bây giờ tôi thấy một số thay đổi bất ngờ trong đầu ra của một ngày khi sử dụng định dạng "tt".Đầu ra của thời gian (AM/PM) đã thay đổi trong Windows 10 khi sử dụng DateTime.ToString ("tt")

Dưới đây là một số mã đó chứng tỏ vấn đề:

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

Sản lượng trong các phiên bản trước của cửa sổ là:

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 

Và trong các cửa sổ 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 

Trong cả hai trường hợp mã này đã được biên dịch giành chiến thắng Visual Studio 2013 nhắm mục tiêu .Net Framework 4.5

Có ai biết tại sao hành vi đã thay đổi không - và tại sao trong cửa sổ 10 nó xuất hiện thiết lập bất kỳ nền văn hóa nào trên một chủ đề cụ thể thay đổi đầu ra của AM/PM thành định dạng "AM"/"PM". nền văn hóa đó?

+0

Mã của bạn đang chạy tốt trên máy tính Windows10/VS2015/4.5. – vendettamit

+1

Bạn có cài đặt các tệp ngôn ngữ Windows 10 cho tất cả các nền văn hóa bạn sử dụng ở đây không? –

+0

Tôi có tất cả các tính năng ngôn ngữ tùy chọn được cài đặt cho en-GB và en-US ... en-AU và en-NZ chỉ là ngoài hộp (nhưng tôi có chúng được định cấu hình làm ngôn ngữ mà tôi có thể đọc và viết bằng cửa sổ 10). Điều này chắc chắn là một hồi quy trong hành vi mà tôi nghĩ - cũng như tôi đã hiểu, dữ liệu CultureInfo được tải từ các cuộc gọi nội bộ, nhưng đến từ dữ liệu luôn có sẵn trong các cửa sổ, ví dụ:thông tin giống với hộp thoại cài đặt ngày và giờ khi bạn chuyển đổi giữa các quốc gia. – Bittercoder

Trả lời

5

Bạn có thể muốn nhìn vào "Dữ liệu Văn hóa nên không được coi là ổn định" http://blogs.msdn.com/b/shawnste/archive/2005/04/05/405694.aspx

Một chút là chúng ta bắt đầu tận dụng CLDR (Common Locale liệu Repository, http://cldr.unicode.org) cho nhiều miền địa phương để phù hợp hơn với ngành công nghiệp tiêu chuẩn. Bạn có thể đã nhận thấy rằng có thêm một vài ngôn ngữ khác mà chúng tôi hiện có dữ liệu cho.

0

Tôi luôn buộc sử dụng ToString("G") khi thay đổi DateTime thành chuỗi với hàm ToString(). Sau đó, tôi không có vấn đề gì để phân tích chuỗi thành DateTime một lần nữa. Tôi đã thử nghiệm nó với ứng dụng khách của tôi (nhận được ngày & thời gian bằng XML theo định dạng "G" và phân tích cú pháp nó thành DateTime) trên Windows 7/8/10.

0

Tôi cũng thấy rằng sự kết hợp của việc nâng cấp 'en-nz' và Windows 10 đột nhiên thay đổi a.m./p.m. thành AM/PM.

Sự khác biệt là đoạn code tôi duy trì chuyển tiếp trên ToShortTimeString() đầu ra với a.m./p.m. nhưng trong Windows 10 nó thay đổi để AM/PM thay vào đó tôi dành lứa tuổi cố gắng tìm chuỗi thông tin văn hóa đúng/định dạng, và tôi cũng đang cố gắng để tìm ra thiếu địa phương đặt trên máy tính Windows 10 mới của tôi so với máy Windows 7 cũ của tôi. Nhưng nó chỉ ra rằng cùng một thiết lập địa phương trên phiên bản khác nhau của máy Windows thực sự hiển thị a.m./p.m.AM/PM khác nhau.

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

Cũng xác nhận rằng DateTimeFormatInfo.AMDesignator cho 'en-nz' bây giờ ra 'AM' thay vì 'sáng'

Các vấn đề liên quan