using YD_Event.Core.Entities; namespace YD_Event.Core.Extensions; /// /// 项目时间处理扩展类 /// 用于统一处理 Project 实体的时间计算逻辑 /// public static class ProjectTimeExtensions { /// /// 获取项目的总时长(秒) /// /// 项目实体 /// 总时长(秒) /// 当 project 为 null 时抛出 public static int GetTotalDurationInSeconds(this Project project) { if (project == null) throw new ArgumentNullException(nameof(project)); // 边界情况处理:确保值不小于 0 int minutes = Math.Max(0, project.DurationMinutes); int seconds = Math.Max(0, project.DurationSeconds); // 确保秒数不超过 59(一分钟内的秒数) seconds = Math.Min(seconds, 59); return minutes * 60 + seconds; } /// /// 设置项目的总时长(秒) /// 自动计算并更新 DurationMinutes 和 DurationSeconds /// /// 项目实体 /// 总时长(秒) /// 当 project 为 null 时抛出 /// 当 totalSeconds 小于 0 时抛出 public static void SetTotalDurationInSeconds(this Project project, int totalSeconds) { if (project == null) throw new ArgumentNullException(nameof(project)); if (totalSeconds < 0) throw new ArgumentOutOfRangeException(nameof(totalSeconds), "总时长不能小于 0"); // 计算分钟和秒 project.DurationMinutes = totalSeconds / 60; project.DurationSeconds = totalSeconds % 60; } /// /// 标准化项目的时间字段 /// 确保 DurationSeconds 在 0-59 范围内,并正确处理负值 /// /// 项目实体 /// 当 project 为 null 时抛出 public static void NormalizeDuration(this Project project) { if (project == null) throw new ArgumentNullException(nameof(project)); // 先获取总秒数 int totalSeconds = project.GetTotalDurationInSeconds(); // 重新设置,确保标准化 project.SetTotalDurationInSeconds(totalSeconds); } /// /// 获取格式化的时长显示字符串(例如:"2分30秒" 或 "30秒") /// /// 项目实体 /// 格式化的时长字符串 /// 当 project 为 null 时抛出 public static string GetFormattedDuration(this Project project) { if (project == null) throw new ArgumentNullException(nameof(project)); int totalSeconds = project.GetTotalDurationInSeconds(); int minutes = totalSeconds / 60; int seconds = totalSeconds % 60; if (minutes == 0) { return $"{seconds}秒"; } else if (seconds == 0) { return $"{minutes}分"; } else { return $"{minutes}分{seconds}秒"; } } /// /// 获取符号格式的时长显示(例如:"2'30\"" 或 "30\"") /// /// 项目实体 /// 符号格式的时长字符串 /// 当 project 为 null 时抛出 public static string GetSymbolFormattedDuration(this Project project) { if (project == null) throw new ArgumentNullException(nameof(project)); int totalSeconds = project.GetTotalDurationInSeconds(); int hours = totalSeconds / 3600; int remainingSeconds = totalSeconds % 3600; int minutes = remainingSeconds / 60; int seconds = remainingSeconds % 60; if (hours == 0) { if (seconds == 0) { return $"{minutes}'"; } else { string paddedSeconds = seconds.ToString().PadLeft(2, '0'); return $"{minutes}'{paddedSeconds}\""; } } else { string result = $"{hours}h"; if (minutes > 0 || seconds > 0) { result += $"{minutes}'"; if (seconds > 0) { string paddedSeconds = seconds.ToString().PadLeft(2, '0'); result += $"{paddedSeconds}\""; } } return result; } } }