2009-09-08 38 views
14

Tôi đang tìm một cách nhận biết miền địa phương để có được một ngày dài mà không có ngày trong tuần. Chỉ một con quái vật như vậy tồn tại?Cách lấy định dạng Ngày dài từ DateTime mà không có ngày trong tuần

Dưới đây là đoạn code tôi sử dụng để có được những định dạng ngày dài bao gồm cả các ngày trong tuần:

DateTime time = ... 
String formattedDate = time.ToLongDateString(); 

Sửa

Các ví dụ về những gì tôi muốn thấy:

  • en -us: ngày 5 tháng 12 năm 2009
  • fr-fr: 5 décembre 2009
  • es-es: 05 de diciembre de 2009

ToLongDateString() trả về như sau:

  • en-us: Thứ bảy 5 tháng 12, 2009
  • fr-fr: Samedi 5 décembre 2009
  • es-es: sábado, 05 de diciembre de 2009

Trả lời

8

này dường như làm các trick.

  1. liệt kê tất cả các mô hình datetime hợp lệ: CultureInfo.DateTimeFormat.GetAllDateTimePatterns
  2. Chọn mẫu dài nhất (có lẽ đây là phù hợp nhất) rằng:
    • Là một chuỗi con của CultureInfo.DateTimeFormat.LongDatePattern
    • Không chứa "ddd" (tên viết tắt)
    • Không chứa "dddd" (tên dài ngày)

Điều này dường như xuất hiện với các chuỗi mà tôi đang tìm kiếm.

Xem mã bên dưới:

class DateTest 
{ 
    static private string GetDatePatternWithoutWeekday(CultureInfo cultureInfo) 
    { 
     string[] patterns = cultureInfo e.DateTimeFormat.GetAllDateTimePatterns(); 

     string longPattern = cultureInfo.DateTimeFormat.LongDatePattern; 

     string acceptablePattern = String.Empty; 

     foreach (string pattern in patterns) 
     { 
      if (longPattern.Contains(pattern) && !pattern.Contains("ddd") && !pattern.Contains("dddd")) 
      { 
       if (pattern.Length > acceptablePattern.Length) 
       { 
        acceptablePattern = pattern; 
       } 
      } 
     } 

     if (String.IsNullOrEmpty(acceptablePattern)) 
     { 
      return longPattern; 
     } 
     return acceptablePattern; 
    } 

    static private void Test(string locale) 
    { 
     DateTime dateTime = new DateTime(2009, 12, 5); 

     Thread.CurrentThread.CurrentCulture = new CultureInfo(locale); 

     string format = GetDatePatternWithoutWeekday(Thread.CurrentThread.CurrentCulture); 

     string result = dateTime.ToString(format); 

     MessageBox.Show(result);    
    } 
} 

Về mặt kỹ thuật, nó có lẽ sẽ không hoạt động nếu một định dạng từ lâu đã có tên trong ngày kẹp ở giữa. Để làm được điều đó, tôi nên chọn mẫu có chuỗi con dài nhất thay vì kết hợp chính xác dài nhất.

0

Hãy thử:

DateTime time = .... 
string formmattedDate = time.Day.ToString() + " " + time.ToString("MMMM"); 
2

Nếu trình tự LongDate cũng là văn hóa cụ thể, thì tôi sợ bạn không may mắn và bạn sẽ phải viết mã thực tế cho việc này. Nếu không, một bộ sưu tập của formatting tags sẽ thực hiện thủ thuật.

Tôi e rằng những gì bạn phải làm là tạo một chuỗi gồm 7 chuỗi (một chuỗi cho mỗi ngày) trong văn hóa địa phương và xóa các chuỗi đó khỏi đầu ra định dạng LongDate của bạn. Sau đó, hãy chắc chắn rằng bạn loại bỏ tất cả các bản sao và không gian.

Hy vọng có cách nào tốt hơn nhưng tôi không thấy.

+0

Yêu cầu kết quả không đúng (bằng cách xóa ngày trong tuần) là một thay thế rất kém chỉ đơn giản yêu cầu một chuỗi ngày được định dạng phù hợp ngay từ đầu. –

+0

@ Stephen: Tôi đồng ý. Nhưng làm cách nào để bạn biết định dạng phù hợp cho văn hóa hiện tại? Thứ tự của năm, tháng và ngày, ký tự phân cách, v.v. –

+1

@David - chính xác, bạn không thể. Nếu nó quan trọng, bạn phải đi nghiên cứu định dạng thích hợp cho mỗi nền văn hóa, như Microsoft đã làm với cultureInfo.DateTimeFormat.LongDatePattern. –

3

A, cách khủng khiếp rất khủng khiếp để thực hiện điều này là để loại bỏ các specifiers định dạng mà bạn không muốn từ LongDatePattern hiện:

public static string CorrectedLongDatePattern(CultureInfo cultureInfo) 
{ 
    var info = cultureInfo.DateTimeFormat; 

    // This is bad, mmmkay? 
    return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim(); 
} 
+0

Điều này là tốt đẹp và đơn giản, nhưng không xử lý * tất cả * trường hợp. Ví dụ ka-GE là "yyyy 'წლის' dd MM, dddd". Câu trả lời này sẽ để lại dấu phẩy sau –

+0

Đồng ý, nó là một giải pháp "rất khủng khiếp, khủng khiếp": D Bạn có thể thêm nó vào regex: /,? \ S * dddd,?/ – user7116

+0

Tôi nghĩ rằng việc thêm vào regex sẽ giúp , Vâng. –

5
String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "") 
-1

gì sai với:

var ci = CultureInfo.CreateSpecificCulture("nl-NL"); 
var date1 = DateTime.ParseExact(date, "dd MMM yyyy", ci); 
+0

Giả sử bạn muốn dd MMM yyyy, sẽ sử dụng tên tháng cụ thể theo ngôn ngữ, nhưng không sử dụng định dạng. Xem các ví dụ trong câu hỏi. –

-1

Chỉ cần xác định các định dạng:

DateTime.ToString("MMMM dd, yyyy"); 
+0

Giả định rằng bạn muốn dd MMMM, yyyy, sẽ sử dụng tên tháng địa phương cụ thể, nhưng không sử dụng định dạng. Xem các ví dụ trong câu hỏi. –

1

Đây là một cũ, thead cũ, nhưng tôi đi qua nó bởi vì nó hoàn toàn phù hợp với trường hợp sử dụng Tôi cần giải quyết. Tôi đã viết một đoạn mã hoạt động, vì vậy tôi nghĩ tôi sẽ đưa nó vào cho những người cần nó. (Nó có thêm một số thủ thuật, như mặc định cho ngày hiện tại và cho phép chuỗi ngày đầy đủ cho một nền văn hóa hoặc chuỗi ngày đầy trong tuần được xóa):

public string DateString(DateTime? pDt = null, string lang, bool includeDayOfWeek = true) 
{ 
    if (pDt == null) pDt = DateTime.Now; 
    DateTime dt = (DateTime)pDt; 

    System.Globalization.CultureInfo culture = null; 
    try { culture = new System.Globalization.CultureInfo(lang); } 
     catch{ culture = System.Globalization.CultureInfo.InvariantCulture; } 

    string ss = dt.ToString("D", culture); 
    if (!includeDayOfWeek) 
    { 
     // Find day-of-week string, and remove it from the date string 
     // (including any trailing spaces or punctuation) 
     string dow = dt.ToString("dddd", culture); 
     int len = dow.Length; 
     int pos = ss.IndexOf(dow); 
     if (pos >= 0) 
     { 
      while (((len + pos) < ss.Length) && (!Char.IsLetterOrDigit(ss[len+pos]))) 
      len++; 
      ss = ss.Substring(0, pos) + ss.Substring(len+pos, ss.Length - (len+pos)); 
     } 
    } 
    return ss; 
} 
0

Tại sao không nhận được LongDate và cắt bỏ phần đầu tiên khi ngày trong tuần xuất hiện?

DateTime date = Convert.ToDateTime(content["DisplayDate"]); 
    //-->3/15/2016 2:09:13 PM 

string newDate = date.ToString("D", new CultureInfo("es-ES")); 
    //--> martes, 15 de marzo de 2016 

var index = newDate.IndexOf(",") + 1; 
    //--> 7 

string finalDate = newDate.Substring(index); 
    //--> 15 de marzo de 2016 
+0

Bởi vì trong một số nền văn hóa, ngày trong tuần có thể không xuất hiện ở phía trước. –

0

Cũ bưu điện, nhưng tôi đang sử dụng này:

public static string ToLongDateWithoutWeekDayString(this DateTime source) 
{ 
    return source.ToLongDateString() 
       .Replace(source.DayOfWeek.ToString(), "") 
       .Trim(',', ' '); 
} 
1

tôi đã mở rộng trên gợi ý bởi Bart Calixto để khắc phục vấn đề định dạng yyyy dd MMM (ở đây tại Úc chúng tôi cũng sử dụng ngày Vương quốc Anh định dạng dd/mm/yy)

Tôi cũng thường cần phải chuyển đổi giữa các định dạng ngày tháng của Aust và Hoa Kỳ.

Mã này sửa chữa vấn đề (phiên bản của tôi là trong VB)

Public Shared Function ToLongDateWithoutWeekDayString(source As DateTime, cult As System.Globalization.CultureInfo) As String 

Return source.ToString("D", cult).Replace(source.DayOfWeek.ToString(), "").Trim(","c, " "c) 

End Function 

Trước khi gọi hàm bạn cần phải thiết lập văn hóa, tôi làm theo cách này sau khi nhận được đất nước của khách truy cập từ http://ipinfo.io

Select Case Country.country 
      Case "AU" 
       cult = New CultureInfo("en-AU") 
      Case "US" 
       cult = New CultureInfo("en-US") 
      Case "GB" 
       cult = New CultureInfo("en-GB") 
     End Select 

Dim date1 As New Date(2010, 8, 18) 
lblDate.Text = ToLongDateWithoutWeekDayString(date1, cult) 

Sau khi đặt kết quả văn hóa AU hoặc GB là 18 tháng 8 năm 2010

Sau khi đặt kết quả văn hóa Hoa Kỳ là ngày 18 tháng 8 năm 2010

Adam bạn có đồng ý điều này giải quyết vấn đề định dạng mà bạn đề cập đến không?

Cảm ơn Bart là mã rất hay.

Đừng quên thêm Dim cult As System.Globalization.CultureInfo sau Inherits System.Web.UI.Trang

+0

Tôi đề nghị thay thế 'source.DayOfWeek.ToString()' bằng 'source.ToString (" dddd ", cult) để nó hoạt động với các ngôn ngữ khác, không chỉ bằng tiếng Anh. –

0

Giải pháp của tôi:

DateTime date = DateTime.Now; 
CultureInfo culture = CultureInfo.CurrentCulture; 
string dayName = date.ToString("dddd", culture); 
string fullDate = date.ToString("f", culture); 
string trim = string.Join(" ", fullDate.Replace(dayName, "").TrimStart(',').TrimStart(' ').Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); 

Dòng cuối cùng:

  1. Loại bỏ dấu phẩy còn sót lại lúc khởi
  2. Loại bỏ không gian còn sót lại lúc khởi
  3. Loại bỏ còn sót lại đôi không gian từ bất cứ nơi nào trong chuỗi

Thử nghiệm cho mỗi nền văn hóa từ

CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); 
Các vấn đề liên quan