C#:实现格式良好的时间字符串的最佳方法?

标签 c# .net datetime system.timers.timer

我正在写这个问题,因为我正在寻求最好的方法来做到这一点。我的程序中有很多这样的东西,我想创建一个方法来将包含计时器秒数的 Int32 转换为格式良好的字符串。

例如,如果我的计时器 int 是在让我们说一个随机数,比如 16429 它将是:

4 hours, 32 minutes and 9 seconds

如果是 600,那就是:

10 minutes

如果是60,就是

1 minute

如果是172801,就是

2 days and 1 second

如果是32,就是

32 seconds

我希望每个单词(如“分钟”、“秒”和“天”)末尾的“s”仅在不等于 1 时才放置 S,因此实际上并不需要正确发音。我也只希望在需要时添加天数和小时数以及其他内容,因此如果计时器小于 1 天(以秒为单位),它只显示小时数、分钟数和秒数,或者需要的内容。

实现这样的目标的最佳方法是什么?我在下面有这个功能,但它非常困惑,只能达到分钟和秒,而不是小时或天:

public static string GetConvertedTime(int timer)
{
    int Minutes = timer / 60;
    int Seconds = timer - Minutes * 60;

    if (timer < 60)
    {
        string secs = (Seconds != 1) ? "s" : "";
        return "" + timer + " second" + secs;
    }

    else
    {
        if (Seconds < 1)
        {
            string mins = (Minutes != 1) ? "s" : "";
            return "" + Minutes + " minute" + mins;
        }
        else
        {
            string mins = (Minutes != 1) ? "s" : "";
            string secs = (Seconds != 1) ? "s" : "";
            return "" + Minutes + " minute" + mins + " and " + Seconds + " second" + secs;
        }
    }
}

执行此操作的最佳方法到底是什么?

最佳答案

“最佳方式”是非常主观的。 DRY 通常是最好的,考虑到本地化和非常规复数形式通常是最好的,保持简短和活泼通常是最好的:

public static string FriendlyDuration(int seconds) {
    int[] divisors = { 60 * 60 * 24, 60 * 60, 60 , 1};
    string[] language = { ", ", " and ", "days", "day", "hours", "hour", "minutes", "minute", "seconds", "second"};
    var parts = new List<string>();
    for (int part = 0; part < divisors.Length; ++part) {
        int count = seconds / divisors[part];
        if (count == 0) continue;
        string unit = language[part*2 + (count == 1 ? 3 : 2)];
        parts.Add(string.Format("{0} {1}", count, unit));
        seconds -= count * divisors[part];
    }
    var result = string.Join(language[0], parts.ToArray());
    if (parts.Count > 1) {
        var ix = result.LastIndexOf(language[0]);
        result = result.Substring(0, ix) + language[1] + result.Substring(ix + language[0].Length);
    }
    return result;
}

关于C#:实现格式良好的时间字符串的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632169/

相关文章:

c# - ClickOnce 部署在 GAC 丢失的 "Microsoft.VisualStudio.Shell.Interop.8.0 Version 8.0.0.0"上失败,虽然它没有在项目中使用?

c# - 本地化的 mvc3 应用程序

c# - 在没有 .NET 的情况下部署应用程序

java - 日期字符串的正确日期格式,例如 "2013-11-16T08:46:00.000-06:00"

c# - 如何使VS2010当前是否正在调试更加可见

c# - 静态初始值设定项与静态构造函数、执行顺序、行为奇怪的 Release模式

c# - 线程可以作为另一个用户执行吗? (.NET 2.0/3.5)

c# - 如何在 C# 中模拟 C++ union ?

python-2.7 - Python2 : Retrieve Sunday - Saturday Week Start/End Dates For Given Date Range

.net - 当且仅当时间部分 = 00 :00:00? 时,如何在显示中抑制 .NET DateTime 的时间部分