C#日期转换器程序

时间:2017-11-13 19:14:22

标签: c#

这将是一个愚蠢的问题,但我目前正在开发一个程序,该程序将采用DD/MM/YYYY格式的用户输入,并以2017年5月1日的格式输出它。

但是每当使用string.substring(在我的情况下为UserInput.substring)时,它都没有正确地分隔值。例如,当我输入日期为21/05/2001时,它显示215 2001.我不知道为什么会发生这种情况。

我很抱歉,因为这是非常无趣的但是我不熟悉使用.substring,而且我确定当有人指出问题时问题会显而易见xD

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DateProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            /// Define Varibles

            string UserIntput;
            int Day;
            int Month;
            int year;

            ///Gathering UserInput

            Console.Write("Please enter the date in the format dd/mm/yyyy");
            UserIntput = Console.ReadLine();

            ///Validations

            try
            {
                while(UserIntput.Substring(2,1) != "/" || UserIntput.Substring(5,1) != "/" || UserIntput.Length != 10)
                {
                    Console.WriteLine("Invalid Input");
                    Console.Write("Please enter the date in the format dd/mm/yyyy");
                    UserIntput = Console.ReadLine();

                }

            }
            catch
            {
                Console.WriteLine("Invalid Input");
            }

            /// Defining to Variables

            Day = Convert.ToInt32(UserIntput.Substring(0, 2));

            Month = Convert.ToInt32(UserIntput.Substring(3, 2));

            year = Convert.ToInt32(UserIntput.Substring(6, 4));

            Console.WriteLine(Day + "" + Month + " " + year);
            Console.ReadLine();
        }
    }
}

4 个答案:

答案 0 :(得分:1)

将用户输入字符串传递给System.Convert.ToDateTime方法:

DateTime dt = Convert.ToDateTime(UserIntput);

然后,如果您想更改其显示格式,请使用DateTime.ToString()重载之一将其转换为您想要的格式。 (在this page上搜索ToString())

它可能看起来像这样:

dt.ToString("MM-dd-yyyy", System.Globalization.CultureInfo.InvariantCulture);

您还要查看此页面:Custom Date and Time Format Strings

答案 1 :(得分:1)

像这样使用ParseExact:

using System;

public class Program
{
    public static void Main()
    {
        DateTime? dt = null;

        do
        { 
            Console.WriteLine("Input date: (dd/MM/yyyy)");
            var input = Console.ReadLine();

            try
            {
                dt = DateTime.ParseExact(input, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        } while (!dt.HasValue);

        Console.WriteLine(dt.Value.ToString("F"));

        var myDate = dt.Value;

        // access the single fields from the parsed object
        Console.WriteLine(myDate.Day);
        Console.WriteLine(myDate.Month);
        Console.WriteLine(myDate.DayOfWeek);
        Console.WriteLine(myDate.Year);
    }
}

请参阅https://dotnetfiddle.net/TeYSF7

除了DateTime-Formatting的“自定义”链接(请参阅BobbyA's answer),请考虑默认情况下的这些链接:standard-date-and-time-format-strings

使用string.Split(..) - 尽管为什么DateTime会提供有效的解析方法。

var parts = "22/12/2012".Split(new []{'/'}, StringSplitOptions.RemoveEmptyEntries);

if (parts.Length == 3)
{
    var day = int.Parse(parts[0]); // will crash if not an int - use .TryParse(...) or handle error
    var month = int.Parse(parts[1]); // will crash if not an int
    var year = int.Parse(parts[2]); // will crash if not an int

    var date = new DateTime(day,month,year)) // will crash if f.e. 45.24.788
}
else
{
    // invalid input
}

答案 2 :(得分:1)

DateTime.TryParseExact的帮助下尝试解析日期和时间,这是专为此类任务而设计的:

 using System.Globalization;

 ...

 DateTime userDate;

 // Gathering UserInput (just one simple loop)

 do {
   Console.WriteLine("Please enter the date in the format dd/mm/yyyy");
 } 
 while (!DateTime.TryParseExact(Console.ReadLine(), 
   "d/m/yyyy", // be nice, let 21.5.2017 be valid; please, do not inist on 21.05.2017 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.AssumeLocal, 
    out userDate));

 // If you insist on these local variables:
 int day = userDate.Day;
 int month = userDate.Month;
 int year = userDate.Year;

 // But I suggest formatting or string interpolation:
 Console.WriteLine($"{userDate:dd MM yyyy}"); 

答案 3 :(得分:0)

假设您想保留当前的方法(而不是使用其他答案中提供的任何内置函数),您的问题只是一个错字。

改变这个:

Console.WriteLine(Day + "" + Month + " " + year);

对此:

Console.WriteLine(Day + " " + Month + " " + year);  //Notice the space

将来,您可以使用常量来避免此类问题:

const string space = " ";
Console.WriteLine(Day + space + Month + space + year);