【问题标题】:How to concatenate integer with string in C#?如何在 C# 中将整数与字符串连接?
【发布时间】:2017-04-20 06:18:57
【问题描述】:

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

输入:02:03:34PM 预期输出:14:03:34

但我得到 14:3:34 下面是我的代码sn-p:

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;

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

【问题讨论】:

  • 你看过DateTime.ToString()吗?
  • 确实...您真的不应该自己进行所有这些格式化或解析。现在也是了解 .NET 命名约定的好时机。
  • ...和 ​​DateTime.ParseExact()
  • 如何在不使用 DateTime 函数的情况下连接它?

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


【解决方案1】:

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

【讨论】:

  • 实际上 OP 的日期时间是从控制台以给定格式输入的,因此您需要在前面创建 DateTime-instance。
  • @HimBromBeere 我提供的示例演示了使用 ToString 方法来格式化 DateTime。当然,在实现之前必须对代码进行编辑,但这取决于 OP。
  • @MickyD 我已经更新了我的答案,并解释了如何将初始字符串转换为 DateTime 对象。
【解决方案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");

【讨论】:

    【解决方案3】:

    _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;
    

    【讨论】:

    • DateTime 中的 Parsexxx() 方法有什么问题?
    • @MickyD 使用它们并没有什么问题,它们可以正常工作。我写这个解决方案只是为了通知 OP 错误的类型转换会导致强类型语言中的错误。
    【解决方案4】:

    只需传递你的输入

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

    【讨论】:

      【解决方案5】:

      到目前为止,其他答案大多针对处理DateTime 的示例,但它们没有解释为什么您的代码会中断。

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

      问题在于int 的内部表示只是数字本身,它不携带格式信息。因此,它不能存储有关前导零的信息。这只能通过使用string 来完成,它不代表一个数字,而是一个字符的集合。

      所以本质是您需要将数据及其表示视为两个独立的事物。一般来说,最好将数据保持在其原始形式中,并且仅在需要显示的最后时刻转换它。这也让您能够尊重展示方式的文化差异。

      许多基本数据类型(包括intDateTime 等)都是可格式化的。这意味着可以将它们转换为相对于描述该表示应该如何的模式的字符串(显示)表示。对于int,这样的模式可以定义它需要有一个前导零,如下所示:

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

      【讨论】:

        【解决方案6】:

        嗨 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-31
          • 2011-08-16
          • 1970-01-01
          • 2013-10-20
          • 2013-10-09
          • 2023-04-02
          • 2012-12-28
          • 1970-01-01
          相关资源
          最近更新 更多