如何在C#中将整数与字符串连接起来?

时间:2017-04-20 06:18:57

标签: c# .net string datetime console-application

我正在开发一个Console应用程序,用于将时间从 12小时格式转换为 24小时格式

  

输入:02:03:34 PM预期输出: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;

我没有得到预期的输出。 请建议。

6 个答案:

答案 0 :(得分:3)

对我来说似乎有点复杂,因为有一种更简单的方法可以将 DateTime 变量显示为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

答案 1 :(得分:2)

尝试使用DateTime.TryParseExact后跟ToString,不要重复Microsoft 并重新发明轮子:

  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");

答案 2 :(得分: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;

答案 3 :(得分: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));
    }

答案 4 :(得分:0)

到目前为止,其他答案主要涉及处理DateTime的示例,但它们并未解释您的代码中断的原因。

您要做的是向int变量添加前导零,就像您使用字符串一样。

问题是int的内部表示只是数字本身,并且它不包含格式信息。因此,它无法存储有关前导零的信息。这只能通过使用string来完成,int不代表数字而是代表字符集。

因此,本质上是您需要将数据及其表示视为两个独立的事物。一般来说,最好将数据保留为原生形式,并且只在需要显示时才转换它。这也允许您尊重显示表示的文化差异。

许多基本数据类型(包括DateTimeint等)都是可格式化的。这意味着它们可以转换为关于描述该表示应该如何的模式的字符串(显示)表示。对于string _hourDisplay = _hour.ToString("00"); ,这样的模式可以定义它需要具有前导零,如下所示:

scrolling="yes"

答案 5 :(得分: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;