从C#正则表达式中的非结构化字符串将日期格式设置为“ MM / dd / yyyy”,

问题描述

我有一个未格式化的字符串(例如:Sundy / 03-1 3-1949) 我需要将其转换为“ dd / MM / yyyy”。

我的计划是删除文本,空格,特殊字符并仅保留数字(例如:Sundy / 03-1 3-1949-> 03131949)

然后将数字转换为日期格式。(例如:Sundy / 03-1 3-1949-> 03131949 ---> 13/03/1949)

我使用的代码

private void button1_Click(object sender,EventArgs e)
    {
       String stringWithDate = textBox1.Text.ToString();


        if (stringWithDate.ToString() != null && !stringWithDate.ToString().Equals(""))
        {
            DateTime dts;
            String str = stringWithDate.ToString();
            str = Regex.Replace(str,@"[^\d]","");

            Console.WriteLine("String: " + stringWithDate.ToString() + "\n Removed Spaces: " + str);

            if (DateTime.TryParseExact(str,"MMddyyyy",System.Globalization.CultureInfo.CurrentCulture,System.Globalization.DateTimeStyles.None,out dts))
            {
                String a = dts.ToString("MM/dd/yyyy");
                stringWithDate = a;
                Console.WriteLine("String: " + stringWithDate.ToString() + "\n Removed Spaces: " + str + "\n Date formatted: " + a + "\n");
                label1.Text = (a);
            }

        }

      
    }

输出未检测到所有类型。有办法传递一切吗?

enter image description here

解决方法

这将获得一些缺少的值,但要理解的一件事很重要,那就是在任何地方都没有计算机程序可以理解人类可能输入的任何日期格式。您需要在前端做得更好,引导人们输入合理,一致且最重要的明确值。

private void button1_Click(object sender,EventArgs e)
{
    if (string.IsNullOrEmpty(textBox1.Text)) return;

    //normalize
    var str = textBox1.Text;
    if (str.Contains(",")) str = str.Split(",")[1];
    str = Regex.Replace(str.Replace("-","/"),@"[^\d/]","");
    if (str.StartsWith("/")) str = str.Substring(1);
    Console.WriteLine($"Original: {textBox1.Text}\nNormalized: {str}");

    //parse
    string[] formats = {"MM/dd/yyyy","MM/d/yyyy"};
    DateTime parsed;
    if (DateTime.TryParseExact(str,formats,CultureInfo.CurrentCulture,DateTimeStyles.None,out parsed))
    {
        var result = parsed.ToString("MM/dd/yyyy");
        Console.WriteLine($"Original: {textBox1.Text}\nNormalized: {str}\nParsed: {result}");
        label1.Text = result;
    }     
}

我将进一步更改它以提取一些较小的方法:

private string NormalizeDateInput(string input)
{
    if (string.IsNullOrEmpty(input)) "";

    if (input.Contains(",")) input = input.Split(",")[1];
    input = Regex.Replace(input.Replace("-","");
    if (input.StartsWith("/")) input = input.Substring(1);
    return input;
}

public DateTime ParseMyDate(string input)
{
    DateTime result = default(DateTime);
    input = NormalizeMyDateInput(input);
    if (string.IsNullOrEmpty(input)) return result;

    DateTime.TryParseExact(input,out result);
    return result;
}

private void button1_Click(object sender,EventArgs e)
{
    DateTime dts = ParseMyDate(textBox1.Text);
    if (dts != default(DateTime))
    {
        label1.Text = dts.ToString("MM/dd/yyyy");
    }
}

这里的一个优点是您可以将修补程序限制为NormalizeDateInput()方法。

,
string str;
            DateTime dts;
            str = Console.ReadLine();
            StringBuilder sb = new StringBuilder();
            foreach (char c in str)
            {
                if ((c >= '0' && c <= '9'))
                {
                    sb.Append(c);
                }
            }
            string str1 = sb.ToString();
            if (DateTime.TryParseExact(str,"MMddyyyy",System.Globalization.CultureInfo.CurrentCulture,System.Globalization.DateTimeStyles.None,out dts))
            {
                String a = dts.ToString("MM/dd/yyyy");
                Console.WriteLine(a);
            }


 I tried for "Sundy /    03 - 1 3 - 1949" it is giving me output 03/13/1947.Try to merger this logic with your code and let me know if it is working 

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...