2017-04-20 20 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;