[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 exectly Win32 compatible behavior use DateTime.ToString() instead.
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);
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);
}
}
// 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. }
}