切换到Unfied API后,将nullable DateTime转换为NSDate

时间:2015-01-13 15:07:06

标签: c# ios datetime xamarin nsdate

我正在转换我的应用程序以支持Xamarin.iOS的新统一API。在这里,我想使用我的旧可空DateTime?来设置datepicker的日期:

datePicker.SetDate (someNullableDate, false);

编译时出现以下错误:

  

错误CS1502:最佳重载方法匹配   `UIKit.UIDatePicker.SetDate(Foundation.NSDate,bool)'有一些无效   参数(CS1502)

  

错误CS1503:参数#1' cannot convert System.DateTime?'   表达式以输入`Foundation.NSDate'(CS1503)

这是我实例化 someNullableDate 的方式:

DateTime? someNullableDate = DateTime.SpecifyKind (someNSDate, DateTimeKind.Unspecified);

在此我将其转换回NSDate

if (someNullableDate != null && someNullableDate.HasValue) {
    DateTime someDate = someNullableDate.GetValueOrDefault ();
    NSDate someNSDate = DateTime.SpecifyKind (someDate, DateTimeKind.Utc);
}

目前所有转化都会引发错误。经典的API能够为我做转换,但由于数据丢失,统一API不再这样做了。详细Xamarin states

  

Unified API不提供NSDate之间的隐式转换   和.NET DateTime,因为它不是无损转换。阻止   与DateTimeKind.Unspecified相关的错误转换.NET DateTime   在转换为NSDate之前到本地或UTC。

Xamarin provided以下扩展方法:

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

public static NSDate DateTimeToNSDate(this DateTime date)
{
    DateTime reference = TimeZone.CurrentTimeZone.ToLocalTime(
        new DateTime(2001, 1, 1, 0, 0, 0) );
    return NSDate.FromTimeIntervalSinceReferenceDate(
        (date - reference).TotalSeconds);
}

我尝试在扩展方法的参数中添加Nullable<DateTime>,但这会导致更多错误。

使用提供的扩展方法应该可以转换DateTime但是如何为可以为空的DateTime进行转换?

1 个答案:

答案 0 :(得分:-1)

我遇到了同样的问题。错误是它无法转换Unspecified DateTimeKind,因此解决方案是首先将DateTime转换为 UTC ,或 LocalTime

if (someNullableDate != null && someNullableDate.HasValue) {
    DateTime someDate = someNullableDate.Value.ToUniversalTime();
    NSDate someNSDate = (NSDate)DateTime.SpecifyKind(someDate, DateTimeKind.Utc);
}