在我的應用程序中,我有一個字符串下拉框,顯示用戶可以選擇12小時的時間。可能的值爲:將12小時時間格式轉換爲24小時整數?
9am
10am
11am
12pm
1pm
2pm
3pm
4pm
5pm
什麼代碼會將其中一個字符串轉換爲24小時整數?例如,10am
應轉換爲10
,4pm
應轉換爲16
。
在我的應用程序中,我有一個字符串下拉框,顯示用戶可以選擇12小時的時間。可能的值爲:將12小時時間格式轉換爲24小時整數?
9am
10am
11am
12pm
1pm
2pm
3pm
4pm
5pm
什麼代碼會將其中一個字符串轉換爲24小時整數?例如,10am
應轉換爲10
,4pm
應轉換爲16
。
您可以使用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的環境。
考慮的時間是連續的,可以簡化邏輯:
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
情況。
您可以使用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
}
如果你有一個下拉菜單,爲什麼不設置的值是整數值,你的願望:
<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>
太棒了。它的「解析」真的是自由的嗎?你甚至不需要傳遞給定時間的格式?另外,如果'CurrentCulture'有'am' /'pm'的其他默認值呢?會發生嗎?畢竟我會建議傳遞格式。反正它是一個簡單的。 – SimpleVar
+1,很好的回答 –
是的,當別人[爲你做/已經完成]爲你推出自己的時候。 :-) –