GetDateFormat (kernel32)
Last changed: -131.107.0.88

.
Summary

C# Signature:

[DllImport("kernel32.dll")]
static extern int GetDateFormat(uint locale, uint dwFlags, IntPtr lpDate, string frmat, StringBuilder sb, int sbSize);

User-Defined Types:

None.

Notes:

Win32 interpret format differently than CLR so if you don't need exectly Win32 compatible behavior use DateTime.ToString() instead.

Tips & Tricks:

SYSTEMTIME is differnt from DateTime so to call GetDateFormat() I declared corespondent SystemTime struct and changed signature to accept it:

[DllImport("kernel32.dll")]
static extern int GetDateFormat(uint locale, uint dwFlags, ref SystemTime date, string format, StringBuilder sb, int sbSize);

Sample Code:

class Test {

    [DllImport("kernel32.dll")]
    static extern int GetDateFormat(int locale, uint dwFlags, ref SystemTime sysTime,
    string lpFormat, StringBuilder lpDateStr, int cchDate
    );

    [StructLayout(LayoutKind.Sequential)]
    private struct SystemTime {
    [MarshalAs(UnmanagedType.U2)] public ushort Year;
    [MarshalAs(UnmanagedType.U2)] public ushort Month;
    [MarshalAs(UnmanagedType.U2)] public ushort DayOfWeek;
    [MarshalAs(UnmanagedType.U2)] public ushort Day;
    [MarshalAs(UnmanagedType.U2)] public ushort Hour;
    [MarshalAs(UnmanagedType.U2)] public ushort Minute;
    [MarshalAs(UnmanagedType.U2)] public ushort Second;
    [MarshalAs(UnmanagedType.U2)] public ushort Milliseconds;

    public SystemTime(DateTime dateTime) {
        this.Year     = (ushort)dateTime.Year;
        this.Month    = (ushort)dateTime.Month;
        this.DayOfWeek    = (ushort)dateTime.DayOfWeek;
        this.Day      = (ushort)dateTime.Day;
        this.Hour     = (ushort)dateTime.Hour;
        this.Minute       = (ushort)dateTime.Minute;
        this.Second       = (ushort)dateTime.Second;
        this.Milliseconds = (ushort)dateTime.Millisecond;
    }
    }

    static void Main(string[] args) {
    int locale = CultureInfo.InvariantCulture.LCID;
    DateTime dt = DateTime.Now;
    SystemTime st = new SystemTime(dt);

    string format = "ddd',' MMM dd yy";

    int defualtBufferSize = 32;
    if (defualtBufferSize < format.Length + 16) {
        defualtBufferSize = format.Length + 16;
    }
    StringBuilder sb = new StringBuilder(defualtBufferSize);
    int res = GetDateFormat(locale, 0, ref st, format, sb, sb.Capacity);
    if (res == 0) {
        res = GetDateFormat(locale, 0, ref st, format, sb, 0);
        if (res != 0) {
        sb = new StringBuilder(res);
        res = GetDateFormat(locale, 0, ref st, format, sb, sb.Capacity);
        }
    }
    if (res <= 0) {
        throw new ArgumentException();
    }
    Console.WriteLine(sb);
    }

}

Alternative Managed API:

// Note: I couldn't make the GetDateFormat call work in C# but this works a treat!

    /// <summary> Provide a translated long date using the given format. </summary>
    /// <param name="languageConstant">Also known as the Locale.</param>
    /// <param name="date">DateTime in a FileTime (int64) format.</param>
    /// <param name="dateFormatString">Standard date format string.</param>
    /// <returns>Long date translated for the given locale.</returns>
    internal static string GetTranslatedDateString(long languageConstant, long date, string dateFormatString)
    {
        if (languageConstant == 0 || date == 0 || dateFormatString == null) { return null; }
        try
        {
            // Translate our particular chosen date format into a .Net DateTime
            DateTime dateTime = DateTime.FromFileTime(date);
            // Create a culture info object for the given culture (could use the string e.g. "DE-de" as an                     // alternative)
            CultureInfo cultureInfo = new CultureInfo((int)languageConstant);

            cultureInfo.DateTimeFormat.LongDatePattern = dateFormatString;
            DateTimeFormatInfo dtFormatInfo = cultureInfo.DateTimeFormat;
            return dateTime.ToString("D", dtFormatInfo);
        }
        catch (Exception ex)  { // etc. }
    }

Documentation