Starward项目实时便笺功能时间显示问题解析
【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: 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. 时区处理不一致
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项目在实时便笺时间显示方面的技术架构相对完善,但仍存在时区处理、格式统一性和多语言支持等方面的改进空间。通过采用统一的时区处理策略、改进时间格式化算法以及添加多语言支持,可以显著提升用户体验。
建议开发团队:
- 统一所有时间处理的时区逻辑
- 优化时间显示格式,支持更多场景
- 添加完整的国际化时间格式支持
- 建立完善的时间相关测试用例
这些改进将确保Starward在不同地区和语言环境下都能提供准确、一致的时间显示体验。
【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



