【问题标题】:Date box forced formatting logic日期框强制格式化逻辑
【发布时间】:2017-12-11 22:50:24
【问题描述】:

所以我有一个我使用的程序,我对他们在输入时如何强制在字段中设置日期格式非常感兴趣。例如,如果我输入“10217”,系统会自动强制该字段变为 10/02/2017。但是,如果我输入 1117,则不会发生任何事情,因为它可能是 01/01/2017、11/17/?? 或许多其他组合。有谁知道这种强制格式化是如何实现的?

此外,您可以在格式为 10.2.17 的同一字段中输入日期,它将重新格式化为 10/2/2017。同样,如果您输入 1.1.17,它将重新格式化为 1/1/2017。最后,您可以执行相同的操作,即添加斜杠,它将重新格式化相应的日期格式。因此,如果我输入 10/2/17,它将重新格式化为 10/2/2017。同样,输入 1/1/17 将重新格式化为 1/1/2017。

我查看了以下链接,但没有看到任何可用于执行此类逻辑的内容。 (当然我可能只是公然错过它。)

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

同样,我也看到过这个围绕正则表达式的示例,但我不熟悉这个过程。

Validating a date format string in c#

我知道这很多,但这一切都围绕日期强制格式化逻辑。我真的不确定使用什么逻辑来实现我想要的或者将什么逻辑链接在一起来实现我正在寻找的东西。我非常感谢所有的意见。

【问题讨论】:

  • 最有可能的是将输入解析为日期,然后使用特定格式格式化日期,然后设置文本框的值。 C# 中没有“灵丹妙药”可以一步完成。 确切地如何完成取决于平台(c# 服务器端、javaScript 客户端等)。当日期不明确时(例如 2017 年 10 月 2 日),“猜测”也可能有一些逻辑。
  • 好的。那讲得通。我现在确实看到它的完成方式可能有太多变数。当然,我可以说它已经完成了客​​户端站点,该软件位于 c#/.net 中,但我还没有看到任何我知道的 JavaScript。我将不得不寻找它。您对如何处理此问题有任何简单或建议吗?我不确定我们可以使用哪些方法来为我们解析文本,或者我是否需要对我能找到的所有案例进行编码。 (注意:我正在尝试使用我正在开发的软件来复制它。)

标签: c# winforms date-formatting


【解决方案1】:

我认为要解决这个问题,可能需要查看他们使用什么来解析用户的输入。如果他们使用的是 DateTime.Parse,那么当被解析的字符串不明确时,它将引发异常。

当然,程序员总是可以创建自己的方式来解析字段中的输入。但是,通常程序员在解析信息时并不热衷于处理模棱两可的情况。因此,为了简单起见,我们假设他们正在使用 DateTime.Parse 方法。

我创建了以下程序,以便您查看解析器何时将某些内容视为模棱两可。程序的输出如下图所示:

演示 DateTime.Parse 的代码:

static void Main(string[] args)
{
    string input = "";
    while(input != "exit" || input != "Exit")
    {
        Console.Write("Input: ");
        input = Console.ReadLine();

        string inputDate = input;
        //try to parse it
        try
        {
            DateTime date = DateTime.Parse(inputDate);
            Console.WriteLine(date+"\n");
        }
        catch
        {
            //Exceptions. String not valid because ambiguity
            Console.WriteLine("Ambiguous.\n");
            //In here can also perform other logic, of course
        }

    }

}

为了将 DateTime 转换回字符串,您可以执行以下操作:

try
{

    DateTime date = DateTime.Parse(inputDate);
    Console.WriteLine(date+"\n");
    string month = date.Month.ToString();
    string day = date.Day.ToString();
    string year = date.Year.ToString();
    string resultingString = month + " " + day + " " + year ;
    Console.WriteLine(resultingString);
}
catch(Exception e)
{
    //Exceptions. String not valid because ambiguity
    Console.WriteLine("Ambiguous");
}

您甚至可以以这种方式使用此信息制作自己的解析器,这样您就可以获得输入的 3 个字符长的日期的结果:

    static void Main(string[] args)
    {
        string input = "";
        while(input != "exit" || input != "Exit")
        {
            Console.Write("Input: ");
            input = Console.ReadLine();

            string inputDate = input;

            try
            {

                DateTime date = DateTime.Parse(inputDate);
                Console.WriteLine(date+"\n");
                string month = date.Month.ToString();
                string day = date.Day.ToString();
                string year = date.Year.ToString();
                string resultingString = month + " " + day + " " + year;
                //string resultingString = month + "/" + day + "/" + year;
                Console.WriteLine(resultingString);
            }
            catch(Exception e)
            {
                //Exceptions. String not valid because ambiguity
                try
                {
                   Console.WriteLine( myParser(inputDate) );
                }
                catch
                {
                    Console.WriteLine("Ambiguous");
                }

                //Console.WriteLine("Ambiguous.\n");
                //In here can also perform other logic, of course
            }

        }

    }

    static string myParser(string input)
    {
        string month,day,year,date;

        switch (input.Length)
        {
            //In the case that it's 1 character in length 
            case 1:
                return "Ambiguous.";
            case 2:
                return "Ambiguous.";

            //did user mean #/#/200#?  hopefully not #/#/199#...
            case 3:
                month = input.Substring(0, 1);
                day = input.Substring(1, 1);
                year = input.Substring(2, 1);
                date = month + " " + day + " " + year;
                return date;
            //did user mean  # # 20## 
            //or             # ## 200# 
            //or             ## # 200#
            case 4:

                return "Ambiguous";
            //user probably means ## # ##
            case 5:
                return "Ambiguous";
            case 6:
                return "Ambiguous";
            default:
                return "Ambiguous";
        }


    }

同样,如果您想以字符串的形式将日期恢复为斜线 (/) 分隔格式,而无需分钟和小时等......

case 3:
    month = input.Substring(0, 1);
    day = input.Substring(1, 1);
    year = input.Substring(2, 1);
    date = month + " " + day + " " + year;

    DateTime dateTimeObj = DateTime.Parse(date);

    month = dateTimeObj.Month.ToString();
    day = dateTimeObj.Day.ToString();
    year = dateTimeObj.Year.ToString();

    string resultingString = month + "/" + day + "/" + year;

    return resultingString;

【讨论】:

  • 我相信这就是他们正在使用的,因为输出正是我想要的。过于扩展您在这里所做的事情,有没有办法不显示时间?也限制它只是该格式的日期?我寻找选项,但我没有看到它。同样,我认为我的代码会强制它返回框中,直到输入有效的可解析字符串。谢谢
  • @RyanWakefield 我希望这是您正在寻找的解析行为的一种方法。
  • @RyanWakefield 抱歉,我再次编辑以显示额外的解析......真可惜。此外,日期条目可能会变得棘手,因此进行实施检查和基本测试以查看您是否获得所需的解析信息非常重要。你测试的越多,你就越了解 DateTime 和你自己的字符串解析方法的解析行为。
  • 所有这一切实际上都非常完美。我相信在查看您的代码后,我可能已经拥有了我需要的东西。作为旁注,日期时间类有一个“日期”属性。不确定它以什么格式返回,但值得一看。谢谢 TON Jamin。绝对是我正在寻找的答案,并且很容易适应带有一些额外处理程序的 winform。 :)
猜你喜欢
  • 1970-01-01
  • 2012-12-19
  • 2017-10-01
  • 2020-10-04
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
相关资源
最近更新 更多