2013-06-12 505 views
3

在我的應用程序中,我有一個字符串下拉框,顯示用戶可以選擇12小時的時間。可能的值爲:將12小時時間格式轉換爲24小時整數?

9am 
10am 
11am 
12pm 
1pm 
2pm 
3pm 
4pm 
5pm 

什麼代碼會將其中一個字符串轉換爲24小時整數?例如,10am應轉換爲104pm應轉換爲16

回答

11

您可以使用DateTime.Parse(...)獲取DateTime值,然後引用.Hour屬性獲取結果;

int h = DateTime.Parse("10am").Hour; // == 10 
int h2 = DateTime.Parse("10pm").Hour; // == 22 

DateTime.Parse是相當自由的在哪呢允許,但顯然做了一些假設內部。例如,在上面的代碼中,DateTime.Parse("10am")在當前時區的當前日期(我認爲...)返回上午10點。因此,請注意您使用API​​的環境。

+1

太棒了。它的「解析」真的是自由的嗎?你甚至不需要傳遞給定時間的格式?另外,如果'CurrentCulture'有'am' /'pm'的其他默認值呢?會發生嗎?畢竟我會建議傳遞格式。反正它是一個簡單的。 – SimpleVar

+0

+1,很好的回答 –

+0

是的,當別人[爲你做/已經完成]爲你推出自己的時候。 :-) –

1

考慮的時間是連續的,可以簡化邏輯:

var firstHourStr = box.Items[0].ToString(); 
var firstHour = int.Parse(firstHourStr.Replace("am", "").Replace("pm", "")); 

if (firstHourStr.Contains("pm")) 
{ 
    firstHour += 12; 
} 

var selectedHour = firstHour + box.SelectedIndex; 

如果時間是靜態的,你知道的第一個小時,你可以有一個常量,並通過多用var selectedHour = FIRST_HOUR + box.SelectedIndex簡化這個過程。

此外,我假定問題中顯示的有效格式。

最後說明:由於「am」之後的小時12是一秒鐘的性質,因此您需要處理導致問題的12pm情況。

1

您可以使用DateTime.Parse,但這並不會很好地與國際化。

int hour = DateTime.Parse(stringValue).Hour; 

相反,只使用DateTime對象在ComboBox和使用formatString的格式化:

// In Constructor: 
cbHours.Items.Add(new DateTime(2000, 1, 1, 8, 0, 0)); 
cbHours.Items.Add(new DateTime(2000, 1, 1, 10, 0, 0)); 
cbHours.Items.Add(new DateTime(2000, 1, 1, 13, 0, 0)); 
cbHours.FormatString = "h tt"; 

// In event handler 
if (cbHours.SelectedIndex >= 0) 
{ 
    int hour = ((DateTime)cbHours.SelectedItem).Hour 
    // do things with the hour 
} 
2

如果你有一個下拉菜單,爲什麼不設置的值是整數值,你的願望:

<asp:DropDownList runat="server" ID="hours"> 
    <asp:ListItem Value="9">9am</asp:ListItem> 
    <asp:ListItem Value="10">10am</asp:ListItem> 
    <!-- etc. --> 
    <asp:ListItem Value="17">5pm</asp:ListItem> 
</asp:DropDownList> 
相關問題