如何修改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
相关产品推荐
相关产品推荐

