2010-10-08 12 views
6

Tôi đang cố định dạng ngày cho một khách hàng Pháp.C# Định dạng thời gian. Bản địa hóa sang tiếng Pháp làm sao tôi có được kết quả "5h 45" cho 5:45?

Tôi cần phải định dạng Times như trong các ví dụ sau ...

06:00 -> 6 h
08:45 -> 8 h 45
10:30 -> 10 h 30
15:00 -> 15 h
17:22 -> 17 h 22
18:00 -> 18 h

tôi đã có thể sử dụng Custom Date and Time Formatting. Nhưng tôi dường như bị mắc kẹt trong ký hiệu này rằng người Pháp (ít nhất là Canada) không hiển thị Biên bản nếu họ không phải là "00".

Hiện tại tôi đang sử dụng định dạng sau.

myDateTime.ToString("H \h mm") 

Tôi làm cách nào để "mm" chỉ xuất hiện khi> 00?

Tôi muốn tránh sử dụng phương pháp mở rộng hoặc lớp proxy vì tôi cảm thấy điều này nên được xây dựng trong khung. Rõ ràng là định dạng chuẩn của nó cho thời đại Pháp.

Chuỗi của tôi "H \ h mm" thực sự xuất phát từ tệp tài nguyên. tức là ...

myDateTime.ToString(Resources.Strings.CustomTimeFormat); 
+0

Mặc dù tôi là người Pháp Tôi không biết chúng tôi không đặt 00 –

+0

Haha. @ GôTô có thể là một điều Canada của người Pháp? – Justin

+1

Vâng, có thể tiếng Pháp của Canada thật kỳ lạ: P (đùa thôi!) –

Trả lời

4

Tôi có một số tin xấu cho bạn. Khung không hỗ trợ định dạng bạn đang tìm kiếm. Mã sau đây chứng minh điều này:

using System; 
using System.Globalization; 

namespace ConsoleApplication1 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      // FR Canadian 
      Console.WriteLine("Displaying for: fr-CA"); 
      DisplayDatesForCulture("fr-CA"); 

      Console.WriteLine(); 
      Console.WriteLine(); 
      Console.WriteLine(); 

      // FR French 
      Console.WriteLine("Displaying for: fr-FR"); 
      DisplayDatesForCulture("fr-FR"); 

      Console.WriteLine(); 
      Console.WriteLine("Press enter to exit."); 
      Console.ReadLine(); 
     } 

     static void DisplayDatesForCulture(string culture) 
     { 
      var ci = CultureInfo.GetCultureInfo(culture); 
      var dt = new DateTime(2010, 10, 8, 18, 0, 0); 

      foreach (string s in ci.DateTimeFormat.GetAllDateTimePatterns()) 
       Console.WriteLine(dt.ToString(s)); 
     } 
    } 
} 

Ứng dụng hiển thị tất cả định dạng ngày giờ được hỗ trợ. Không ai trong số họ hỗ trợ khái niệm về 18:00 ==> 18 giờ, v.v.

Tùy chọn tốt nhất của bạn là viết phương pháp mở rộng hoặc phương pháp tương tự.

Văn hóa cách tiếp cận nhạy cảm: xây dựng một lớp mở rộng helper:

public static class DateHelper 
{ 
    public static string ToLocalizedLongTimeString(this DateTime target) 
    { 
     return ToLocalizedLongTimeString(target, CultureInfo.CurrentCulture); 
    } 

    public static string ToLocalizedLongTimeString(this DateTime target, 
     CultureInfo ci) 
    { 
     // I'm only looking for fr-CA because the OP mentioned this 
     // is specific to fr-CA situations... 
     if (ci.Name == "fr-CA") 
     { 
      if (target.Minute == 0) 
      { 
       return target.ToString("H' h'"); 
      } 
      else 
      { 
       return target.ToString("H' h 'mm"); 
      } 
     } 
     else 
     { 
      return target.ToLongTimeString(); 
     } 
    } 
} 

Bạn có thể kiểm tra như sau:

var dt = new DateTime(2010, 10, 8, 18, 0, 0); 

// this line will return 18 h 
Console.WriteLine(dt.ToLocalizedLongTimeString(CultureInfo.GetCultureInfo("fr-CA"))); 

// this line returns 6:00:00 PM 
Console.WriteLine(dt.ToLocalizedLongTimeString()); 

var dt2 = new DateTime(2010, 10, 8, 18, 45, 0); 

// this line will return 18 h 45 
Console.WriteLine(dt2.ToLocalizedLongTimeString(CultureInfo.GetCultureInfo("fr-CA"))); 

// this line returns 6:45:00 PM 
Console.WriteLine(dt2.ToLocalizedLongTimeString()); 
+0

Điểm lớn cho câu trả lời của bạn được viết rất tốt và tôi thích các bài kiểm tra được bao gồm. Tôi đã đăng câu trả lời của riêng tôi mà là một chút chung chung hơn để hy vọng chứa tất cả các định dạng DateTime tùy chỉnh người dùng có thể muốn sử dụng. – Justin

1

Nó có thể không được khá nhưng nếu họ cứ khăng khăng

if (Locality == france) 
myDateTime.ToString(Resources.Strings.CustomTimeFormat).Replace("00","") ; 
else 
myDateTime.ToString(Resources.Strings.CustomTimeFormat); 
+1

Điều đó không đẹp, nhưng tôi không nghĩ có một lựa chọn khác:/ –

2

Tiếp theo ý tưởng phương pháp khuyến nông code4life của, đây là một phương pháp khuyến nông. = P

public static string ToCanadianTimeString(this DateTime source) 
{ 
    if (source == null) 
     throw new ArgumentNullException("source"); 

    if (source.Minute > 0) 
     return String.Format("{0:hh} h {0:mm}", source); 

    else 
     return String.Format("{0:hh} h", source); 
} 
+0

bạn nên làm cho văn hóa nhạy cảm ... – code4life

+0

Muhahaha, đó là: "ToCanadianTimeString". –

+0

@ code4life: Tôi có thể nghĩ ra một vài cách để truy vấn văn hóa hiện tại hoặc truyền vào văn hóa. Tôi sẽ cập nhật ví dụ cho một trong số đó một chút sau đó nếu đó là ý của bạn. – Moudis

1

Dưới đây là giải pháp tôi đang đi với:

public static string ToStringOverride(this DateTime dateTime, string format) 
{ 
    // Adjust the "format" as per unique Culture rules not supported by the Framework 
    if (CultureInfo.CurrentCulture.LCID == 3084) // 3084 is LCID for fr-ca 
    { 
     // French Canadians do NOT show 00 for minutes. ie. 8:00 is shown as "8 h" not "8 h 00" 
     if (dateTime.Minute == 0) 
     { 
      format = format.Replace("mm", string.Empty); 
     } 
    } 

    return dateTime.ToString(format); 
} 

Nó sẽ ít nhất làm việc cho các định dạng DateTime khác nhau như ...

  • H \ h mm
  • dddd d MMMM yyyy H \ h mm tt

Ý tưởng ở đây là để tôi sửa đổi các FormatString để loại bỏ "mm" nếu phút là zero. Vẫn để cho khung làm công việc khó khăn.

0

Đây không phải là khá một trong hai:

myDateTime.ToString(myDateTime.Minute == 0 ? @"H \h" : @"H \h mm") 
Các vấn đề liên quan