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

Flutter本地存储计时并按需计算时长的实现示例求助

实现方案与代码示例

核心逻辑

要解决这个问题,关键是存储完整的日期时间(而非仅时分),否则跨天计算会出现错误。核心步骤如下:

  • 点击按钮时,记录当前完整DateTime并持久化到本地
  • 登录后:
    1. 读取存储的时间
    2. 计算当前时间与存储时间的流逝时长
    3. 用预设时长减去流逝时长得到剩余时长(确保结果不为负)
    4. 根据剩余时长决定停止程序或展示结果

代码示例(以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:32:16