Search code examples
c#datetimedatetime-format

DateTime formatting Month regardless of culture?


Can we format a DateTime in the following way based on the users windows culture...

en-GB = 1st May 2023

en-US = May 1st 2023

without explicitly checking the CultureInfo and setting the format for each culture via ToString("dd MMM yyy") or ToString("MMM dd yyy") respectively?


Solution

  • If I understand you right, you want to detect day and month order for the current culture and then select either MMM dd yyy format string (for, say, US culture) or dd MMM yyy (for GB culture).

    Please, note that some cultures (e.g. Chinese) uses year first

    year month day
    

    format. If you insist on year to be at the end regardless the culture (so "modified" Chinese will be month day year) you can use DateTimeFormat.MonthDayPattern:

    private static string MyDateTimeFormatString() =>
      CultureInfo.CurrentCulture.DateTimeFormat.MonthDayPattern[0] == 'M'
        ? "MMM dd yyy"   // Month before day
        : "dd MMM yyy";  // Day before month
    
    private static string MyDateTimeFormat(DateTime value) => 
      value.ToString(MyDateTimeFormatString());
    

    Usage is simple

    DateTime date = ...
    
    var result = MyDateTimeFormat(date);
    

    And so we have

    en-GB = 01 May 2023 (United Kingdom)
    en-US = May 01 2023 (United States)
    cn-CN = May 01 2023 (China) 
    

    Fiddle