Xamarin“ iOS Foundation NSDate到C#DateTime的转换”,反之亦然,不节省DayLight

7vi*_*am7 3 c# datetime nsdate ios xamarin

我需要转换Cocoa NSDateC# DateTime,反之亦然。

我正在使用以下方法来实现此目的:

 public static DateTime NSDateToDateTime (Foundation.NSDate date)
 {
    DateTime reference = TimeZone.CurrentTimeZone.ToLocalTime (
        new DateTime (2001, 1, 1, 0, 0, 0));
   return reference.AddSeconds (date.SecondsSinceReferenceDate);
 }

 public static Foundation.NSDate DateTimeToNSDate (DateTime date)
 {
    DateTime reference = TimeZone.CurrentTimeZone.ToLocalTime (
        new DateTime (2001, 1, 1, 0, 0, 0));
    return Foundation.NSDate.FromTimeIntervalSinceReferenceDate (
        (date - reference).TotalSeconds);
 }
Run Code Online (Sandbox Code Playgroud)

但事实证明,这种方式无法解决夏令时问题。

例如。DateTimeDST中时间为5AM的对象返回NSDate的时间为6AM。

7vi*_*am7 6

基于以下输入:\n https://forums.xamarin.com/discussion/27184/convert-nsdate-to-datetime \xe2\x80\xa8

\n\n

Local Time期间发生变化Daylight Saving。\n因此,始终转换为UTC进行计算,然后Local time在需要时转换为。

\n\n
     public static DateTime NSDateToDateTime (Foundation.NSDate date)\n     {\n        DateTime reference = new DateTime(2001, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);\n        var utcDateTime = reference.AddSeconds(date.SecondsSinceReferenceDate);\n        return utcDateTime.ToLocalTime();\n     }\n\n     public static Foundation.NSDate DateTimeToNSDate (DateTime date)\n     {\n        DateTime reference = new DateTime(2001, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);\n        var utcDateTime = date.ToUniversalTime();\n        return Foundation.NSDate.FromTimeIntervalSinceReferenceDate((utcDateTime - reference).TotalSeconds);\n     }\n
Run Code Online (Sandbox Code Playgroud)\n


Chr*_*iak 6

我很确定这是一种过时的方法。您现在可以将NSDate直接转换为DateTime。

 Foundation.NSDate nsDate = // someValue
 DateTime dateTime = (DateTime)nsDate;
Run Code Online (Sandbox Code Playgroud)

  • @tiritea NSDates 通常采用 UTC,因此转换会将其转换为 UTC DateTime 对象。(您可以通过检查“dateTime.Kind”属性来检查这一点)。要将上面示例中的 DateTime 对象转换为本地时间,您可以使用: var localDateTime = dateTime.ToLocalTime() (2认同)