我需要在使用时间表的应用程序中以 24 小时格式对一天中的时间执行一些计算。例如,17h + 12h = 5h。我尝试创建自己的 Time
结构并环绕 TimeSpan
或 DateTime
。它工作正常,但我对要在 ToString
中完成的格式设置感到困惑。
的确,我当然希望我的结构能够在任何文化下工作。起初我想将格式委托(delegate)给 DateTime
结构并跳过所有与时间不严格相关的自定义格式。我无法将此任务委托(delegate)给 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);
}
}
我查看了 DateTime
结构的 ToString
方法是如何在 mscorlib 中实现的。哇... 这么多东西要考虑。我想或多或少地重写其中的内容,但只保留与时间相关的内容,但所有内容都混在一起,不容易理解。而且我注意到一些绝对不是直接处理的东西,例如希伯来语格式等。我将花费比我预期重写所有这些更多的时间!特别是我不想在没有清楚地了解自己在做什么的情况下这样做。
总结一下:
- 如何创建“所有文化兼容”的时间格式?
- 上一级,我是否使用
DateTime
或TimeSpan
的包装器正确处理了问题?我不能直接使用TimeSpan
:它使用负时间(我使用模数使时间严格在 0 到 23:59:59.999 之间),它不处理 AM/PM在某些文化中,它使用Day
。对我来说,“一天中的某个时间”不同于“时间跨度”。 - 我不需要处理时区或夏令时,也不需要处理闰秒,因为我处于与日历无关的环境中,但我希望能够处理一天中时间的本地化格式。 (例如,使用“H”(或任何希伯来语、中文、泰米尔语或俄语字符)代替“:”或 AM/PM 代替 24 小时格式)。
任何指向我一些库或教程的提示或帮助都会有所帮助!
我看过this post在问这个问题之前先看看this library也可以,但是对于我想要实现的目标来说,它看起来太复杂了。
最佳答案
(我意识到这是我自己项目的插件,但希望人们会看到它完全相关:)
Any hint or help pointing me to some libraries or tutorials will be helpful!
我是 Noda Time 的主要开发人员图书馆,它应该做你想做的大部分事情。查看user guide获取初步信息 - 并随时在此处或邮件列表中提出更多问题。
你要的类型是LocalTime
.
是的,关于 DateTime
和 TimeSpan
在这里都不合适,而且格式/解析很复杂,你是对的:)
在 Noda Time 中,您可以像使用普通 BCL 类型一样使用 ToString
方法,当前有静态Parse
/TryParse
/ParseExact
/TryParseExact
方法 - 但这些方法今晚可能会消失 :) 相反,您应该使用 LocalTimePattern
: 一次定义模式(根据格式和文化),然后将其用于格式化和解析。
在格式化和解析方面,你需要非常清楚自己需要什么。 Noda Time 在 BCL 上搭载了诸如 AM/PM 指示符之类的东西。事实上,你只处理一天中的时间使得它很多更简单,因为没有无需担心月/日名称(和不同的日历)。对于特定文化,您可以使用 t
模式表示“短”,使用 T
表示“长” - 或者指定自定义模式。自定义模式通常对机器对机器的通信更有用;标准的对于面向用户的格式更有用。
(目前,您必须“知道”t
和 T
模式的存在 - 当然,它们已记录在用户指南中。有时我将创建方法使这更简单...)
关于c# - C# 中的一天中的时间结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11598675/