首页 > 解决方案 > 将 DateTime 转换为可为空的 long 时出错

问题描述

我很困惑,需要有人解释我如何做到这一点,因为我在这里缺少概念。下面的代码按预期工作,但我的目标是以滴答声(纪元)发送 StartDate。我想将 json 中的日期时间转换为 getter setter 属性中的刻度,而不是主类中的刻度。这甚至可能吗?如果是,请解释。因为当我将 Employee 类中的 DateTime 更改为 long 时,它将 06/05/2010 06:00:00 AM 转换为可为空的 long 时出现错误。先感谢您。

    public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        private string _startDate { get; set; }
        public DateTime StartDate
        {
            get
            {
                return DateTime.Parse(_startDate);
            }
            set
            {
                _startDate = value.ToString();
            }
        }
    }

    static void Main(string[] args)
    {
        string input = "{ \"startDate\":\"06/05/2010 06:00:00 AM\", \"FirstName\":\"John\",\"LastName\":\"Smith\"}";
        Employee emp = JsonConvert.DeserializeObject<Employee>(input);
        Console.WriteLine($"{emp.FirstName} {emp.LastName}'s start date is {emp.StartDate.ToString()}");
        Console.ReadLine();
    }

当我这样做时出错

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    private string _startDate { get; set; }
    public long? StartDate
    {
        get
        {
            return DateTime.Parse(_startDate).Ticks;
        }
        set
        {
            _startDate = value.ToString();
        }
    }
}

标签: c#serialization

解决方案


您的设计存在根本问题:

private string _startDate { get; set; }

public long? StartDate
{
    get
    {
        return DateTime.Parse(_startDate).Ticks;
    }
    set
    {
        _startDate = value.ToString();
    }
}

当您使用 setter 时,您会将字符串设置为类似的"132332"内容,但是当您使用 getter 时,您将无法将该值解析为 DateTime - 它不是有效的日期时间格式。

一种解决方法是将属性更改为:

public long? StartDate
{
    get
    {
        return DateTime.Parse(_startDate).Ticks;
    }
    set
    {
        _startDate = new DateTime(value ?? 0).ToString();
    }
}

我相信您可以使用序列化属性和 DateTime 支持字段来实现类似于您打算使用以下代码执行的操作:

public class MyClass
{
    public     static void Main(string[] args)
    {
        string input = "{ \"startDate\":\"06/05/2010 06:00:00 AM\", \"FirstName\":\"John\",\"LastName\":\"Smith\"}";
        Employee emp = (Employee)JsonConvert.DeserializeObject<Employee>(input);
        Console.WriteLine($"{emp.FirstName} {emp.LastName}'s start date is {new DateTime(emp.StartDate ?? 0)}");
    }
}

public class Employee
{        
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [JsonProperty("startDate")]
    private DateTime _startDate { get; set; }

    [JsonIgnore]
    public long? StartDate
    {
        get
        {
            return _startDate.Ticks;
        }
        set
        {
            _startDate = new DateTime(value ?? 0);
        }
    }
}

推荐阅读