GetDateFormat (kernel32)
Last changed: -131.107.0.88

.
Summary

C# Signature:

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

User-Defined Types:

SYSTEMTIME in Win32 is different then DateTime in CLR. This structure may represent SYSTEMTIME in CLR world:

    [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;
    }

Notes:

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

Tips & Tricks:

Sample Code:

    using System;
    using System.Text;
    using System.Globalization;
    using System.Runtime.InteropServices;

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

        StringBuilder sb = new StringBuilder(format.Length + 16);
        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:

    DateTime.ToString(string format, IFormatProvider provider);

Documentation