2017-04-20 85 views
1

我正在開發用於從12小時格式轉換時間24小時格式一個Console應用:如何連接整數與C#中的字符串?

輸入:下午2點03分34秒預期輸出:14:03:34

但我得到14:3:34 下面是我的代碼片段:

string[] arr_temp = Console.ReadLine().Split(':'); 

string time = arr_temp[2].ToUpper().Contains("AM") ? "AM" : "PM"; 

string sec=string.Empty; 

for (int i = 0; i < 2; i++) 
{ 
    sec+= arr_temp[2][i]; 
} 

int _hour = Int32.Parse(arr_temp[0])==0?0: Int32.Parse(arr_temp[0]); 

int _minute = Int32.Parse(arr_temp[1]) == 0 ? 0 : Int32.Parse(arr_temp[1]); 

int _sec = Int32.Parse(sec)==0?0: Int32.Parse(sec); 

_hour = (time == "PM") ? _hour += 12 : _hour += 0; 

_hour = (_hour < 10) ? '0' + _hour : _hour; 

_minute = (_minute < 10) ? '0' + _minute : _minute; 

_sec = (_sec < 10) ? '0' + _sec : _sec; 

我沒有得到預期的輸出。 請建議。

+1

你看着'則DateTime.ToString( )'? – Haukinger

+0

確實......你真的不應該做所有這些格式化或解析自己。現在將是倚重.NET命名約定的好時機。 –

+0

請檢查http://stackoverflow.com/questions/8337625/convert-am-pm-time-to-24-hours-format –

回答

3

似乎有點複雜,我因爲有一個更簡單,以顯示你的日期時間變量12或24小時制的方式。

首先,您必須將字符串轉換爲有效的DateTime對象。您可以使用解析方法,但是您將首先驗證用戶返回的輸入字符串作爲有效日期。

使用下面的代碼,以您的字符串轉換爲DateTime:如果輸入字符串是不正確的格式

string dateString = "03/01/2009 10:00 AM"; 
DateTime date = DateTime.Parse(dateString); 

DateTime.Parse會拋出異常。爲了確保不會發生這種情況,請改爲使用DateTime.TryParse

string dateString = "03/01/2009 10:00 AM"; 
DateTime dateTime; 
if (DateTime.TryParse(dateString , out dateTime)) 
{ 
    Console.WriteLine(dateTime); 
} 

然後,您可以顯示DateTime變量並以您想要的方式進行格式化。

DateTime dateTime = DateTime.Now; 
string str12Format = dateTime.ToString("hh:mm:ss tt"); //12 hours format 
string str24Format = dateTime.ToString("HH:mm:ss tt"); //24 hours format 
+2

實際上OP有一個給定格式的控制檯的datetime,所以你需要在前面創建'DateTime'實例。 – HimBromBeere

+0

@HimBromBeere我提供的示例演示了ToString方法的用法,以格式化DateTime。當然,編輯必須在執行前對代碼進行編輯,但這取決於OP。 –

+0

@MickyD我已經更新了我的答案,並解釋瞭如何將初始字符串轉換爲DateTime對象。 –

1

_hour你的代碼是一個整數。您不能將字符串連接到整數。但相反是可能的。

所以,你應該使用這樣的:

int _hour = Int32.Parse(arr_temp[0])==0?0: Int32.Parse(arr_temp[0]); 
int _minute = Int32.Parse(arr_temp[1]) == 0 ? 0 : Int32.Parse(arr_temp[1]); 
int _sec = Int32.Parse(sec)==0?0: Int32.Parse(sec); 

_hour = (time == "PM") ? _hour += 12 : _hour += 0; 

String _hourS = (_hour < 10) ? '0' + _hour : _hour; 
String _minuteS = (_minute < 10) ? '0' + _minute : _minute; 
+1

'DateTime'中的'Parsexxx()'方法有什麼問題? – MickyD

+0

@MickyD使用它們沒有任何問題,他們會工作得很好。我寫這個解決方案只是爲了通知OP,錯誤的類型轉換可能導致強類型語言中的錯誤。 – mrid

+0

這很好,謝謝 – MickyD

0

只是通過你輸入

public static TimeSpan ConvertToAMPM(DateTime date) 
    { 
     return TimeSpan.Parse(date.ToString("h:mm tt", 
     CultureInfo.InvariantCulture)); 
    } 

    public static TimeSpan ConvertTo24Hour(string time) 
    { 
     var cultureSource = new CultureInfo("en-US", false); 
     var cultureDest = new CultureInfo("de-DE", false); 
     var dt = DateTime.Parse(time, cultureSource); 
     return TimeSpan.Parse(dt.ToString("t", cultureDest)); 
    } 
2

嘗試使用DateTime.TryParseExact其次ToString,不要重複微軟和推倒重來:

string source = Console.ReadLine(); 
    DateTime date; 

    // DateTime.TryParseExact supports many formats; that's why "12:34AM" will be accepted 
    // DateTimeStyles.AllowWhiteSpaces let us be nice and allow, say "11 : 34 : 47 PM" 
    if (DateTime.TryParseExact(
     source, 
     new string[] {"h:m:stt" , "h:mtt", "htt", "H:m:s", "H:m", "H"}, 
     CultureInfo.InvariantCulture, // or CultureInfo.CurrentCulture 
     DateTimeStyles.AssumeLocal | DateTimeStyles.AllowWhiteSpaces, 
     out date)) 
    Console.WriteLine(date.ToString("HH:mm:ss")); 
    else 
    Console.WriteLine($"Sorry, {source} is not a valid date"); 
+0

謝謝你的幫助:) –

+0

@Nishank Jain:不客氣! –

0

其他的答案至今大多地址處理DateTime的示例,但它們不能解釋爲什麼代碼會中斷。

你正在做的是將一個前導零加到int變量上,就像你用字符串做的那樣。

問題是int的內部表示只是數字本身,它不包含任何格式信息。因此,它不能存儲關於前導零的信息。這隻能通過使用string來完成,它不代表數字而是一組字符。

所以其實質是你需要將數據及其表示看作兩件獨立的事情。一般情況下,最好將數據保存爲本地格式,並且只在需要顯示的最後時刻進行轉換。這也可以讓你尊重顯示錶示的文化差異。

許多基本數據類型(包括intDateTime等)都是可格式化的。這意味着它們可以被轉換成一個字符串(顯示)表示方式,相對於描述這種表示應該如何的模式。對於int,這樣的模式可以定義它需要有一個前導零,像這樣:

string _hourDisplay = _hour.ToString("00"); 
+0

謝謝你的幫助:) –

0

嗨Nishank,使用此代碼:

string[] arr_temp = Console.ReadLine().Split(':'); 

string time = arr_temp[2].ToUpper().Contains("AM") ? "AM" : "PM"; 
string sec = arr_temp[2].Substring(0, 2); 

string _hour = ""; 
if (time == "PM" && Int32.Parse(arr_temp[0]) < 12) 
    _hour = (Int32.Parse(arr_temp[0]) + 12).ToString("D2"); 
else if (time == "AM" && Int32.Parse(arr_temp[0]) == 12) 
    _hour = "00"; 
else 
    _hour = Int32.Parse(arr_temp[0]).ToString("D2"); 

string _minute = Int32.Parse(arr_temp[1]) == 0 ? "00" : Int32.Parse(arr_temp[1]).ToString("D2"); 

string _sec = Int32.Parse(sec) == 0 ? "00" : Int32.Parse(sec).ToString("D2"); 

string outputTime = _hour + ":" + _minute + ":" + _sec + "" + time;