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

use*_*069 13 c#

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

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

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

Mar*_*age 25

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

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

写作时间2:00 PM而不是14:00:00日期/时间格式和文化.这全都是由DateTime班级处理的.

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

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

  • 使用DateTime:

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

    使用的格式说明符ToString记录在MSDN 上的" 自定义日期和时间格式字符串"页面上.指定CultureInfo使用所需AM/PM指示符的a非常重要.否则,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);
    
    Run Code Online (Sandbox Code Playgroud)

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


M.B*_*ock 8

TimeSpan表示时间间隔而不是一天中的时间.该DateTime结构更可能你在找什么.

  • 实际上,只要确保“ TotalDays <1”,“ TimeSpan”就非常适合表示一天中的某个时间。运算符重载使您可以轻松地计算特定日期的事件的“ DateTime”和代表一天中某个时间的给定的“ TimeSpan”。此外,DateTime.TimeOfDay将返回TimeSpan。 (2认同)

小智 7

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

var t = DateTime.Now.TimeOfDay;

Console.WriteLine(new DateTime(t.Ticks).ToString("hh:mm:ss tt"));
Run Code Online (Sandbox Code Playgroud)

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


Tim*_*ter 6

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

例如今天下午2点:

TimeSpan ts = TimeSpan.FromHours(14);
DateTime dt = DateTime.Today.Add(ts);
Run Code Online (Sandbox Code Playgroud)

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

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

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


Kru*_*ada 5

试试这个代码:

int timezone = 0;
Run Code Online (Sandbox Code Playgroud)

该字符串给出 12 小时格式

string time = DateTime.Now.AddHours(-timezone).ToString("hh:mm:ss tt");
Run Code Online (Sandbox Code Playgroud)

该字符串给出 24 小时格式

string time = DateTime.Now.AddHours(-timezone).ToString("HH:mm:ss tt");
Run Code Online (Sandbox Code Playgroud)