4

我需要在使用时间表的应用程序中以 24 小时格式对天数执行一些计算。例如,17h + 12h = 5h。我试图创建自己的Time结构并环绕TimeSpanor DateTime。它工作正常,但我遇到了要在ToString.

事实上,我当然希望我的结构能够在任何文化下工作。起初,我正在考虑将格式委托给一个DateTime结构并跳过所有与时间无关的自定义格式。我不能将此任务委托给 a TimeSpan,因为它不处理某些文化中使用的 AM/PM。例如,在我的Time结构中,我写道:

public string Format(string format, IFormatProvider provider)
{
    return TimeFormat.Format(this, format, DateTimeFormatInfo.GetInstance(provider), provider);
}

// ...

internal class TimeFormat
{
    internal string Format(Time time, string format, DateTimeFormatInfo dtfi, IFormatProvider provider)
    {
        DateTime dt = new DateTime(DateTime.MinValue, 1, 1, time.Hours, time.Minutes, time.Seconds, time.Milliseconds);

        /* Here I am checking what the 'format' string is made of 
        and filter-out anything that is not strictly-time related. */

        return dt.Format(format, provider);
    }
}

我查看了ToString该结构的方法是如何在DateTimemscorlib 中实现的。哇……要考虑的东西太多了。我想或多或少地重写其中的内容,但只保留与时间相关的内容,但所有内容都混在其中,不容易理解。而且我注意到一些绝对不简单的东西也可以处理,例如希伯来语格式等。这将花费我比我期望的更多的时间来重写所有这些!特别是我不想在没有清楚地了解我在做什么的情况下这样做。

所以总结一下:

  • 如何创建“所有文化兼容”的时间格式?
  • 上一层,我是否使用DateTimeor的包装器正确处理了问题TimeSpan?我不能直接使用 a TimeSpan:它适用于负时间(我使用模数将时间严格控制在 0 到 23:59:59.999 之间),它在某些文化中不处理 AM/PM,它使用Days。对我来说,“一天中的时间”不同于“时间跨度”。
  • 我不需要处理时区或 DST,也不需要闰秒,因为我处于与日历无关的上下文中,但我希望能够处理一天中时间的本地化格式。(例如,使用 'H'(或任何希伯来语、中文、泰米尔语或俄语字符)代替 ':' 或 AM/PM 代替 24 小时格式)。

任何指向我一些库或教程的提示或帮助都会有所帮助!

在提出这个问题之前,我查看了这篇文章并查看了这个库,但对于我想要实现的目标来说,它看起来太复杂了。

4

1 回答 1

4

(我意识到这是我自己项目的插件,但希望人们会看到它完全相关:)

任何指向我一些库或教程的提示或帮助都会有所帮助!

我是Noda Time库的主要开发人员,它应该可以满足您的大部分需求。有关初始信息,请参阅用户指南- 并随时在此处或邮件列表中提出更多问题。

你想要的类型是LocalTime.

是的,你在这两个方面都是对的,DateTime而且TimeSpan在这里不合适,而且格式化/解析很复杂:)

在 Noda Time 中,您可以像使用普通 BCL 类型一样使用这些方法,ToString并且目前有静态///Parse方法TryParse-但这些方法今晚很可能会消失 :) 相反,您应该使用: 定义一次模式(根据格式和文化),然后将其用于格式化和解析。ParseExactTryParseExactLocalTimePattern

在格式化和解析方面,你需要非常清楚你需要什么。Noda Time 在 BCL 上搭载了诸如 AM/PM 指示符之类的东西。事实上,您只处理一天中的时间,这使得它变得更加简单,因为没有月/日名称(和不同的日历)担心。您可以将模式用于特定文化t的“短”和“长” - 或指定自定义模式。T自定义模式通常对机器对机器的通信更有用;标准的对于面向用户的格式更有用。

(Currently you have to "know" that the t and T patterns exist - although they're documented in the user guide, of course. At some point I'll create methods to make this simpler...)

于 2012-07-22T08:12:14.647 回答