2012-04-12 189 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

相關問題