[DllImport("kernel32.dll")]
static extern int GetDateFormat(uint locale, uint dwFlags, IntPtr lpDate, string frmat, StringBuilder sb, int sbSize);
None.
Win32 interpret format differently than CLR so if you don't need exactly Win32 compatible behavior use DateTime.ToString() instead.
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);
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);
}
}
DateTime.Now.ToString("D", cultureInfo.DateTimeFormat);