c# - C# 中的一天中的时间结构

标签 c# datetime time

我需要在使用时间表的应用程序中以 24 小时格式对一天中的时间执行一些计算。例如,17h + 12h = 5h。我尝试创建自己的 Time 结构并环绕 TimeSpanDateTime。它工作正常,但我对要在 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 中实现的。哇... 这么多东西要考虑。我想或多或少地重写其中的内容,但只保留与时间相关的内容,但所有内容都混在一起,不容易理解。而且我注意到一些绝对不是直接处理的东西,例如希伯来语格式等。我将花费比我预期重写所有这些更多的时间!特别是我不想在没有清楚地了解自己在做什么的情况下这样做。

总结一下:

  • 如何创建“所有文化兼容”的时间格式?
  • 上一级,我是否使用 DateTimeTimeSpan 的包装器正确处理了问题?我不能直接使用 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 .

是的,关于 DateTimeTimeSpan 在这里都不合适,而且格式/解析很复杂,你是对的:)

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

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

(目前,您必须“知道”tT 模式的存在 - 当然,它们已记录在用户指南中。有时我将创建方法使这更简单...)

关于c# - C# 中的一天中的时间结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11598675/

相关文章:

c# - 使用 Microsoft Expression Studio 创建普通 Windows 窗体

c# - MigrationHistory 表中的模型列是什么?

c# - DataTables MVC 回发数据为空

PHP 时间戳在总剩余小时数中不同

python - 如何转换为 "end-of-month"?

c# - 如何在本地调试由EventGrid触发的Azure Function?

c# - 字符串到日期时间转换失败

php - PHP 中的 ISO8601 日期,格式为 YYYY-MM-DDTHH :MM:SS. mmmmmmmZ

python - 将日期列和时间列合并为日期时间列

java - 使用 Joda-Time 倒数圣诞节