如何将24小时格式的TimeSpan转换为12小时格式的TimeSpan?

我有TimeSpan数据表示为24小时格式,如14:00:00,我想将其转换为12小时格式,下午2:00,我google搜索并发现stackoverflow和msdn相关的东西,但没有解决这个问题,任何人都可以帮助我吗? 提前致谢。

更新似乎可以将24小时格式TimeSpan转换为String,但无法将字符串转换为12小时格式TimeSpan 🙁

但是我仍然有很多好的答案,谢谢!

TimeSpan表示时间间隔,而不是一天中的时间。 DateTime结构更有可能是您正在寻找的。

(在一个答案中总结我分散的评论。)

首先,您需要了解TimeSpan表示时间间隔。 此时间间隔在内部表示为刻度的计数,而不是字符串14:00:00和字符串2:00 PM 。 只有将TimeSpan转换为字符串时,才能讨论两种不同的字符串表示forms。 从一种表示切换到另一种表示不会改变或转换存储在TimeSpan的滴答计数。

写作时间为2:00 PM而不是14:00:00是关于日期/时间格式和文化。 这全部由DateTime类处理。

但是,即使TimeSpan表示时间间隔,它也非常适合表示一天中的时间( DateTime.TimeOfDay返回TimeSpan )。 因此,将其用于此目的并非不合理。

要执行描述的格式化,您需要依赖DateTime的格式化逻辑或只是创建自己的格式代码。

  • 使用DateTime

     var dateTime = new DateTime(timeSpan.Ticks); // Date part is 01-01-0001 var formattedTime = dateTime.ToString("h:mm tt", CultureInfo.InvariantCulture); 

    在MSDN上的自定义日期和时间格式字符串页面上记录了在ToString中使用的格式说明符。 指定使用所需AM / PM指示符的CultureInfo非常重要。 否则, tt格式说明符可以用空字符串替换。

  • 使用自定义格式:

     var hours = timeSpan.Hours; var minutes = timeSpan.Minutes; var amPmDesignator = "AM"; if (hours == 0) hours = 12; else if (hours == 12) amPmDesignator = "PM"; else if (hours > 12) { hours -= 12; amPmDesignator = "PM"; } var formattedTime = String.Format("{0}:{1:00} {2}", hours, minutes, amPmDesignator); 

    不可否认,这个解决方案比第一种方法复杂得多。

您需要先将TimeSpan转换为DateTime对象,然后使用您需要的任何DateTime格式 :

 var t = DateTime.Now.TimeOfDay; Console.WriteLine(new DateTime(t.Ticks).ToString("hh:mm:ss tt")); 

ToShortTimeString()也可以工作,但它依赖于区域设置,因此在非美国系统上无法正确显示(或正确,取决于您的看法)。

TimeSpan表示时间间隔(时间之间的差异),而不是日期或时间,因此以24或12h格式定义它是没有意义的。 我假设你真的想要一个DateTime

例如今天下午2点:

 TimeSpan ts = TimeSpan.FromHours(14); DateTime dt = DateTime.Today.Add(ts); 

然后,您可以根据需要格式化该日期:

 String formatted = String.Format("{0:d/M/yyyy hh:mm:ss}", dt); // "12.4.1012 02:00:00" - german (de-DE) 

http://msdn.microsoft.com/en-us/library/az4se3k1%28v=vs.100%29.aspx

试试此代码:

 int timezone = 0; 

此字符串提供12小时格式

 string time = DateTime.Now.AddHours(-timezone).ToString("hh:mm:ss tt"); 

此字符串提供24小时格式

 string time = DateTime.Now.AddHours(-timezone).ToString("HH:mm:ss tt"); 

假设您在24小时范围内停留,您可以通过从今天的DateTime (或任何日期)中减去负TimeSpan来实现您想要的效果,然后剥去日期部分:

 DateTime dt = DateTime.Today; dt.Subtract(-TimeSpan.FromHours(14)).ToShortTimeString(); 

产量:

下午2:00

 String formatted = yourDateTimeValue.ToString("hh:mm:ss tt");