这将是一个愚蠢的问题,但我目前正在开发一个程序,该程序将采用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();
}
}
}
答案 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);