【问题标题】:Timeformat that show total elapsed minutes显示总经过分钟数的时间格式
【发布时间】:2019-03-06 14:54:44
【问题描述】:

我想让用户选择显示计时器的格式。用户可以选择的时间格式:

mm\:ss
mm\:ss\.f
mm\:ss\.ff
hh\:mm\:ss
hh\:mm\:ss\.f
hh\:mm\:ss\.ff

然后在代码中我有一个转换为字符串的时间跨度,例如:

Return timespan.ToString(TimeFormat)

问题是,如果用户使用 mm:ss 格式,则会显示分钟,当它经过 59 分钟时,它会再次从零开始。我想要的是显示总分钟数。所以60分43秒

我已阅读整个 MS 文档,但找不到解决方案。 https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings

【问题讨论】:

  • 不幸的是,使用标准的.ToString() 格式化程序是不可能的。我可以建议检查一下:stackoverflow.com/questions/6074363/…
  • 如果是120分钟呢?您的格式显示两个字符几分钟?
  • 您应该创建自己的函数(如果您不在其他任何地方使用它,可能会覆盖 ToString)。在该函数中,您可以检查输入,并为以 mm 开头的人声明您自己的处理。
  • 创建自己的 ToString 不会占用大量 CPU 时间吗?您必须每次检查是否有一个小时,如果有,请更改格式类型。仅供参考:格式连接到由 DispatcherTimer 以 60hz 刷新的计时器

标签: c# wpf vb.net datetime string-formatting


【解决方案1】:

您可以只返回一个自定义格式的字符串。像这样的:

if (TimeFormat == "some format")
    return $"{timespan.TotalMinutes} minutes, {timespan.Seconds} seconds";

【讨论】:

  • 我认为这应该是{timespan.TotalMinutes} - 否则它会再次环绕。
  • @Neil:对,我修改了我的答案。谢谢。
  • 我认为 OP 想要显示 timespan.Seconds 而不是 timespan.TotalSeconds。例如“60 分 43 秒”而不是“60 分 3643 秒”。
【解决方案2】:

听起来你需要'g'格式:

此说明符仅输出需要的内容。它是文化敏感的,采用 [-][d':']h':'mm':'ss[.FFFFFFF] 的形式。

Details here

【讨论】:

  • 感谢您的提示,但我无法控制用户希望看到多少毫秒。
  • 如果用户被打扰超过 60 分钟,他们真的被打扰到毫秒吗?
【解决方案3】:

根据我从 cmets 获得的建议和更多的谷歌搜索,我找不到一个非常像框架的解决方案,所以我找到了一个肮脏的 Select Case,它就像一个魅力。

Select Case objSettings.TimeFormat
    Case "m\:ss"
        Return String.Format("{0}:{1:00}", Math.Floor(time.TotalMinutes), time.Seconds)
    Case "m\:ss\.f"
        Return String.Format("{0}:{1}", Math.Floor(time.TotalMinutes), time.ToString("ss\.f"))
    Case "m\:ss\.ff"
        Return String.Format("{0}:{1}", Math.Floor(time.TotalMinutes), time.ToString("ss\.ff"))
    Case "mm\:ss"
        Return String.Format("{0:0#}:{1:00}", Math.Floor(time.TotalMinutes), time.Seconds)
    Case "mm\:ss\.f"
        Return String.Format("{0:0#}:{1:00}", Math.Floor(time.TotalMinutes), time.ToString("ss\.f"))
    Case "mm\:ss\.ff"
        Return String.Format("{0:0#}:{1:00}", Math.Floor(time.TotalMinutes), time.ToString("ss\.ff"))
    Case "hh\:mm\:ss"
        Return String.Format("{0:0#}:{1}", Math.Floor(time.TotalHours), time.ToString("mm\:ss"))
    Case "hh\:mm\:ss\.f"
        Return String.Format("{0:0#}:{1}", Math.Floor(time.TotalHours), time.ToString("mm\:ss\.f"))
    Case "hh\:mm\:ss\.ff"
        Return String.Format("{0:0#}:{1}", Math.Floor(time.TotalHours), time.ToString("mm\:ss\.ff"))
    Case Else
        Return time.ToString(objSettings.TimeFormat)
End Select

【讨论】:

    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 2020-07-22
    • 2012-06-16
    • 2020-09-08
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多