You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改DateTime属性的内部存储格式为dd-mm-yyyy hh-mm?

实现TimeCard类按指定格式存储ClockIn/ClockOut的方案

首先明确:DateTime类型本身会存储完整的日期时间戳(包含秒、毫秒等),没法让它只存储到分钟级别,所以要实现你的需求,有两种实用方案:

方案一:用字符串直接存储格式化后的时间

把ClockIn和ClockOut改成字符串类型,在设置值时确保格式符合要求,同时提供快速设置当前时间的方法:

using System.Globalization;

public class TimeCard
{
    public int Id { get; set; }

    private string _clockIn;
    public string ClockIn
    {
        get => _clockIn;
        set
        {
            // 验证输入格式是否符合要求(可选,避免非法值)
            if (DateTime.TryParseExact(value, "dd-MM-yyyy HH-mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out _))
            {
                _clockIn = value;
            }
            else
            {
                throw new ArgumentException("ClockIn必须是dd-MM-yyyy HH-mm格式");
            }
        }
    }

    private string _clockOut;
    public string ClockOut
    {
        get => _clockOut;
        set
        {
            if (DateTime.TryParseExact(value, "dd-MM-yyyy HH-mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out _))
            {
                _clockOut = value;
            }
            else
            {
                throw new ArgumentException("ClockOut必须是dd-MM-yyyy HH-mm格式");
            }
        }
    }

    public bool IsIn { get; set; }
    public string Comment { get; set; }

    // 快速设置当前时间为ClockIn
    public void SetClockInNow()
    {
        _clockIn = DateTime.Now.ToString("dd-MM-yyyy HH-mm", CultureInfo.InvariantCulture);
    }

    // 快速设置当前时间为ClockOut
    public void SetClockOutNow()
    {
        _clockOut = DateTime.Now.ToString("dd-MM-yyyy HH-mm", CultureInfo.InvariantCulture);
    }
}

方案一优缺点

  • 优点:严格按你要的格式存储,不会有多余的时间信息
  • 缺点:无法直接对时间做计算(比如计算工作时长),如果需要处理时间逻辑会很麻烦

方案二:保留DateTime类型,截断多余时间并提供格式化输出

继续用DateTime存储,但在设置值时自动截断秒和毫秒,同时新增只读属性输出指定格式的字符串:

using System.Globalization;

public class TimeCard
{
    public int Id { get; set; }

    private DateTime _clockIn;
    public DateTime ClockIn
    {
        get => _clockIn;
        set
        {
            // 截断到分钟,丢弃秒和毫秒
            _clockIn = new DateTime(value.Year, value.Month, value.Day, value.Hour, value.Minute, 0);
        }
    }

    private DateTime _clockOut;
    public DateTime ClockOut
    {
        get => _clockOut;
        set
        {
            _clockOut = new DateTime(value.Year, value.Month, value.Day, value.Hour, value.Minute, 0);
        }
    }

    // 提供格式化后的字符串属性,供外部调用
    public string FormattedClockIn => _clockIn.ToString("dd-MM-yyyy HH-mm", CultureInfo.InvariantCulture);
    public string FormattedClockOut => _clockOut.ToString("dd-MM-yyyy HH-mm", CultureInfo.InvariantCulture);

    public bool IsIn { get; set; }
    public string Comment { get; set; }

    // 快速打卡方法
    public void ClockInNow()
    {
        var now = DateTime.Now;
        ClockIn = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0);
    }

    public void ClockOutNow()
    {
        var now = DateTime.Now;
        ClockOut = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0);
    }
}

方案二优缺点

  • 优点:保留了DateTime类型的所有便利(比如可以计算时间差、比较先后),同时能输出你需要的格式
  • 缺点:DateTime内部还是会存0秒0毫秒,但这些信息不会影响使用,也不会在格式化输出中显示

纠正你之前的错误尝试

你写的ClockIn = DateTime.Now.ToString("dd:M:yyyy:H:m")会编译报错,因为ClockIn是DateTime类型,不能直接赋值字符串,这是类型不匹配导致的。

内容的提问来源于stack exchange,提问作者molly1312

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:11:04