【问题标题】:Converting nullable DateTime to NSDate after switching to Unfied API切换到 Unfied API 后将可为空的 DateTime 转换为 NSDate
【发布时间】:2015-01-13 15:07:06
【问题描述】:

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

datePicker.SetDate (someNullableDate, false);

编译时出现以下错误:

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

错误 CS1503:参数 #1' cannot convertSystem.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

统一 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,您将如何做到这一点?

【问题讨论】:

    标签: c# ios datetime xamarin nsdate


    【解决方案1】:

    我遇到了同样的问题。错误是它不能转换Unspecified DateTimeKind,所以解决方法是先将DateTime转换为UTC,或者LocalTime

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

    【讨论】:

    • 您的代码有问题。 SpecifyKind 返回 DateTime 而不是 NSDate
    • 对不起,您还必须将 DateTime 从 SpecifyKind 方法转换为 NSDate。
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2011-01-31
    • 1970-01-01
    • 2015-08-17
    • 2011-04-24
    • 2017-04-23
    • 2021-09-11
    相关资源
    最近更新 更多