Flutter本地存储计时并按需计算时长的实现示例求助
实现方案与代码示例
核心逻辑
要解决这个问题,关键是存储完整的日期时间(而非仅时分),否则跨天计算会出现错误。核心步骤如下:
- 点击按钮时,记录当前完整
DateTime并持久化到本地 - 登录后:
- 读取存储的时间
- 计算当前时间与存储时间的流逝时长
- 用预设时长减去流逝时长得到剩余时长(确保结果不为负)
- 根据剩余时长决定停止程序或展示结果
代码示例(以C# MAUI为例,跨平台通用)
1. 点击按钮存储时间
private void SaveSessionTime_Clicked(object sender, EventArgs e) { // 用ISO标准格式存储当前完整时间,避免解析歧义 string savedTime = DateTime.Now.ToString("o"); Preferences.Set("StoredSessionTime", savedTime); }
2. 登录后计算剩余时长
private void CalculateRemainingTime() { // 预设时长,示例为2小时 TimeSpan presetDuration = TimeSpan.FromHours(2); TimeSpan remaining = presetDuration; // 读取本地存储的时间 if (Preferences.ContainsKey("StoredSessionTime")) { string storedStr = Preferences.Get("StoredSessionTime", string.Empty); if (DateTime.TryParseExact(storedStr, "o", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime storedTime)) { TimeSpan elapsed = DateTime.Now - storedTime; // 确保剩余时长不会为负数 remaining = presetDuration - elapsed > TimeSpan.Zero ? presetDuration - elapsed : TimeSpan.Zero; } } // 处理结果 if (remaining == TimeSpan.Zero) { // 停止程序,例如退出应用 Application.Current.Quit(); } else { // 在界面展示剩余时长,示例更新Label文本 RemainingTimeLabel.Text = $"剩余时长:{remaining.ToString(@"hh\:mm\:ss")}"; } }
关键注意点
- 禁止仅存储时分:仅存时分无法处理跨天场景,必须存储完整的日期+时间
- 使用标准时间格式:用ISO 8601格式(
"o")存储,避免因区域设置导致的解析错误 - 边界值处理:计算剩余时长时要确保结果不小于0,避免出现负数时长展示
内容的提问来源于stack exchange,提问作者Enns
相关产品推荐
相关产品推荐

