private static string GetMacDateTimeStringHelper(DateTime dt, string cultureStr, CFDateFormatterStyle dateStyle, CFDateFormatterStyle timeStyle, bool isUniv) { #if REMOVE IntPtr cfLocale = IntPtr.Zero; IntPtr cfLocaleName = IntPtr.Zero; cfLocaleName = CFStringCreateWithCharacters(IntPtr.Zero, cultureStr, cultureStr.Length); cfLocale = CFLocaleCreate(IntPtr.Zero, cfLocaleName); IntPtr cfDateFormatter = CFDateFormatterCreate(IntPtr.Zero, cfLocale, dateStyle, timeStyle); if (isUniv) { IntPtr cfTZName = CFStringCreateWithCharacters(IntPtr.Zero, "GMT", 3); IntPtr cfTZ = CFTimeZoneCreateWithName(IntPtr.Zero, cfTZName, true); CFDateFormatterSetProperty(cfDateFormatter, GetCFString("kCFDateFormatterTimeZone"), cfTZ); if (cfTZName != IntPtr.Zero) CFRelease(cfTZName); if (cfTZ != IntPtr.Zero) CFRelease(cfTZ); } DateTime date = dt.ToUniversalTime(); IntPtr cfReturn = CFDateFormatterCreateStringWithAbsoluteTime(IntPtr.Zero, cfDateFormatter, ((double)date.Ticks) / WIN32_CF_TICKS_RATIO - WIN32_CF_TICKS_DELTA); int newLength = CFStringGetLength(cfReturn); CFRange cfRange = new CFRange(); cfRange.x = 0; cfRange.y = newLength; StringBuilder sb = new StringBuilder(newLength); CFStringGetCharacters(cfReturn, cfRange, sb); string ret = sb.ToString().Substring(0, newLength); if (cfLocale != IntPtr.Zero) CFRelease(cfLocale); if (cfLocaleName != IntPtr.Zero) CFRelease(cfLocaleName); if (cfDateFormatter != IntPtr.Zero) CFRelease(cfDateFormatter); if (cfReturn != IntPtr.Zero) CFRelease(cfReturn); return ret; #else throw new NotImplementedException(); #endif }
public static extern IntPtr /* CFDateFormatterRef */ CFDateFormatterCreate(IntPtr /* CFAllocatorRef */ alloc, IntPtr /* CFLocaleRef */ locale, CFDateFormatterStyle dateStyle, CFDateFormatterStyle timeStyle);
private static string GetUnivMacDateTimeString(DateTime dt, string cultureStr, CFDateFormatterStyle dateStyle, CFDateFormatterStyle timeStyle) { return GetMacDateTimeStringHelper(dt, cultureStr, dateStyle, timeStyle, true); }