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 exactly Win32 compatible behavior use DateTime.ToString() instead.

Tips & Tricks:

SYSTEMTIME is different from DateTime so to call GetDateFormat() I declared correspondent 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:

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

        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:

    DateTime.Now.ToString("D", cultureInfo.DateTimeFormat);

Documentation