2012-04-12 162 views
13

我有时间跨度的数据,例如14:00:00,我想将其转换为12小时格式,2:00 PM,我用Google搜索,发现在计算器和MSDN相关的东西,但没”解决这个问题,任何人都可以帮助我吗?提前致谢。如何将24小时格式TimeSpan转换为12小时格式TimeSpan?表示为24小时格式

更新 看来,它可能24小时制时间跨度转换为字符串,但不可能将字符串转换为12小时制时间跨度:(

但我仍然有这么多好的答案,谢谢!

+1

你能否提供你的代码..了解你的问题.. – vikrantx 2012-04-12 12:21:26

+0

它不是很清楚你能否详细说明一下。 Timespan不是绝对的时间,所以你不能在AM/PM中表示它。所以14:00:00并不是Timespan,它只是以这种格式存储在字符串变量中的时间? – 2012-04-12 12:22:59

+0

这[链接](http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx)将帮助 – vikrantx 2012-04-12 12:26:26

回答

6

TimeSpan表示时间间隔一天的时间。该DateTime结构更可能你在找什么。

+1

实际上'TimeSpan'非常适合代表一天中的某个时间,只要您确定TotalDays <1'即可。运算符重载允许您轻松地计算特定日期事件的'DateTime'和给定'TimeSpan'代表一天中的时间。此外'DateTime.TimeOfDay'将返回一个'TimeSpan'。 – 2012-04-12 13:58:46

+0

许多好的观点,虽然需要稍微改变时间表示的思维方式。令人困惑的是,认为'DateTime'类型返回代表一天中的某个时间可能具有实际跨越_multiple days_的值(尽管在逻辑上从不会)。 – 2012-04-12 14:04:48

1

假设你是ST在24小时的范围内阿英,你可以达到你想要的东西通过从今天的DateTimeTimeSpan(或与此有关的任何日期),然后剥去日期部分:

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

产量:

2 :00 PM

5

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

6

您需要将时间跨度转换为DateTime对象第一,然后使用任何你需要的DateTime format

var t = DateTime.Now.TimeOfDay; 

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

ToShortTimeString()也将工作,但这样就不会正确显示(或正确的,这取决于你怎么看它)在非美国系统是区域的设置有关。

+1

您需要在ToString调用中指定'CultureInfo.InvariantCulture'类似'CultureInfo.InvariantCulture'来避免当前文化使用24小时时间格式(在这种情况下,格式说明符'tt'插入空字符串)时出现问题。 – 2012-04-12 14:06:36

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

试试这个代码:

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"); 
22

(加我在单个答案中分散评论。)

首先你要明白,TimeSpan代表的时间间隔。该时间间隔被内部表示为蜱一个不是字符串14:00:00也不字符串2:00 PM的计数。只有当您将TimeSpan转换为字符串时,才有意义讨论两个不同的字符串表示形式。从一种表示切换到另一种表示不会更改或转换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); 
    

    使用ToString的格式说明记录了Custom Date and Time Format Strings页面上MSDN上。指定使用所需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); 
    

    诚然,这种解决方案比第一种方法更复杂了不少。

+0

哇...如此详细的答案,2解决方案,并在MSDN上自定义格式教程...非常感谢! – user1108069 2012-04-12 15:17:05

+0

这个解决方案帮助了我最好的。我的格式化时间变量如下所示: 'var formattedTime = String.Format(“{0} {1}”,hours,amPmDesignator);' – 2017-02-08 16:59:45

相关问题