Starward项目实时便笺功能时间显示问题解析

Starward项目实时便笺功能时间显示问题解析

【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 【免费下载链接】Starward 项目地址: https://gitcode.com/gh_mirrors/st/Starward

问题背景

Starward作为米哈游游戏的多功能启动器,其实时便笺功能是玩家监控游戏资源的重要工具。然而,在时间显示方面存在一些技术挑战,特别是在处理不同游戏API返回的时间格式时。

核心技术架构

时间数据模型

Starward采用统一的时间处理架构,核心时间属性定义在StarRailDailyNote类中:

/// <summary>
/// 开拓力恢复时间,秒
/// </summary>
[JsonPropertyName("stamina_recover_time")]
[JsonConverter(typeof(TimeSpanSecondNumberJsonConverter))]
public TimeSpan StaminaRecoverTime { get; set; }

/// <summary>
/// 开拓力完全恢复的时间戳,秒
/// </summary>
[JsonPropertyName("stamina_full_ts")]
[JsonConverter(typeof(TimestampNumberJsonConverter))]
public DateTimeOffset StaminaFullTime { get; set; }

JSON转换器实现

项目实现了多种时间格式转换器来处理不同的API响应格式:

// 时间戳数字转换器
internal class TimestampNumberJsonConverter : JsonConverter<DateTimeOffset>
{
    public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTimeOffset.FromUnixTimeSeconds(reader.GetInt64());
    }
}

// 时间跨度秒数转换器  
internal class TimeSpanSecondNumberJsonConverter : JsonConverter<TimeSpan>
{
    public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return TimeSpan.FromSeconds(reader.GetInt64());
    }
}

常见时间显示问题分析

1. 时区处理不一致

mermaid

2. 时间格式化问题

当前的时间格式化实现:

internal class TimeSpanToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is TimeSpan time)
        {
            return $"{Math.Floor(time.TotalHours)}h {time.Minutes}m";
        }
        else
        {
            return null!;
        }
    }
}

这种格式化方式存在以下问题:

  • 使用Math.Floor可能导致小时数显示不准确
  • 分钟显示未补零,格式不统一
  • 不支持多语言时间格式

3. 跨天计算逻辑

/// <summary>
/// 隔天开拓力回满
/// </summary>
[JsonIgnore]
public bool StaminaRecoveryBeyondTomorrow => 
    StaminaFullTime.LocalDateTime.Date > CurrentTime.LocalDateTime.Date;

这种比较方式在时区切换时可能出现问题。

解决方案与最佳实践

1. 统一时区处理

建议使用统一的时区处理策略:

// 使用明确的时区转换
public DateTimeOffset GetLocalTime(DateTimeOffset utcTime)
{
    return TimeZoneInfo.ConvertTime(utcTime, TimeZoneInfo.Local);
}

2. 改进时间格式化

public string FormatTimeSpan(TimeSpan timeSpan)
{
    if (timeSpan.TotalHours >= 1)
    {
        return $"{(int)timeSpan.TotalHours:D2}:{timeSpan.Minutes:D2}:{timeSpan.Seconds:D2}";
    }
    else
    {
        return $"{timeSpan.Minutes:D2}:{timeSpan.Seconds:D2}";
    }
}

3. 添加多语言支持

public string GetLocalizedTimeString(TimeSpan timeSpan, string culture)
{
    var cultureInfo = new CultureInfo(culture);
    return timeSpan.ToString("hh\\:mm\\:ss", cultureInfo);
}

性能优化建议

优化策略实施方法预期效果
时间缓存缓存转换后的时间字符串减少重复计算
懒加载仅在需要时进行时间转换降低CPU开销
批量处理同时处理多个时间字段提高处理效率

测试用例设计

[Test]
public void TestTimeSpanFormatting()
{
    var converter = new TimeSpanToStringConverter();
    var result = converter.Convert(TimeSpan.FromHours(2.5), null, null, null);
    Assert.AreEqual("02:30:00", result);
}

[Test] 
public void TestTimezoneConversion()
{
    var utcTime = DateTimeOffset.FromUnixTimeSeconds(1736000000);
    var localTime = TimeZoneInfo.ConvertTime(utcTime, TimeZoneInfo.Local);
    Assert.AreEqual(TimeZoneInfo.Local.BaseUtcOffset, localTime.Offset);
}

总结

Starward项目在实时便笺时间显示方面的技术架构相对完善,但仍存在时区处理、格式统一性和多语言支持等方面的改进空间。通过采用统一的时区处理策略、改进时间格式化算法以及添加多语言支持,可以显著提升用户体验。

建议开发团队:

  1. 统一所有时间处理的时区逻辑
  2. 优化时间显示格式,支持更多场景
  3. 添加完整的国际化时间格式支持
  4. 建立完善的时间相关测试用例

这些改进将确保Starward在不同地区和语言环境下都能提供准确、一致的时间显示体验。

【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 【免费下载链接】Starward 项目地址: https://gitcode.com/gh_mirrors/st/Starward

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值