gpt4 book ai didi

c# - 有没有更聪明的方法来使用 DateTime 对象生成 "time since"

转载 作者:太空狗 更新时间:2023-10-29 19:56:27 24 4
gpt4 key购买 nike

我有这段代码可以记录过去的时间并生成一个可读的字符串来表示它是多久以前的。

  1. 我原以为 Timespan.Hours 会给你几个小时,即使它是过去的多天,但它看起来像是将它分解成单独的部分(天、月等)。我如何获得总小时数(即使超过 1 天?

  2. 有没有更简洁的方法来编写下面这种类型的代码,因为它看起来很像意大利面条。

这是代码

        DateTime when = GetDateTimeinPast();
TimeSpan ts = DateTime.Now.Subtract(when);

switch (ts.Days)
{
case 0:
if (ts.Hours < 1)
b.Append( ts.Minutes + " minutes ago");
else
b.Append( ts.Hours + " hours ago");
break;
case 1:
b.Append( " yesterday");
break;
case 2:
case 3:
case 4:

b.Append( "on " + when.DayOfWeek.ToString());
break;
default:
b.Append(ts.Days + " days ago");
break;
}

最佳答案

在时间跨度对象中使用 TotalHours 属性或其他 Total[TimeUnit] 属性。

对于 1:10 (hh:mm) 的时间跨度,它等于 1 小时 和 10 分钟 或 1.167 TotalHours 和 70 总分钟数


至于清理它,请像之前一样坚持使用 if/else 分支。 switch/case 不会帮助您解决这些条件,仅针对特定值。像这样:

DateTime when = GetDateTimeinPast();
TimeSpan ts = DateTime.Now.Subtract(when);
if (ts.TotalHours < 1)
b.AppendFormat("{0} minutes ago", (int)ts.TotalMinutes);
else if (ts.TotalDays < 1)
b.AppendFormat("{0} hours ago", (int)ts.TotalHours);
//etc...

C# 8 及更高版本,您可以使用 switch 表达式和属性模式将其进一步压缩为单个表达式。

(DateTime.Now - when) switch
{
{ TotalHours: < 1 } ts => $"{ts.Minutes} minutes ago",
{ TotalDays: < 1 } ts => $"{ts.Hours} hours ago",
{ TotalDays: < 2 } => $"yesterday",
{ TotalDays: < 5 } => $"on {when.DayOfWeek}",
var ts => $"{ts.Days} days ago",
};

关于c# - 有没有更聪明的方法来使用 DateTime 对象生成 "time since",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3383464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com