使用正则表达式将dd / mm / yy转换为dd / mm / yyyy

时间:2015-06-17 16:50:43

标签: c# regex masking date-of-birth

我正在使用正则表达式,我希望将dd/mm/yy转换为完整dd/mm/yyyy

例如。用户输入他的出生日期:01/11/94
该计划将年份94转换为1994

现在,如果用户插入出生日期:01/11/09
该计划将年份09转换为01/11/2009,因为它不能是1909。除非你是吸血鬼。

现在,如果用户插入出生日期:01/11/15
该程序让用户继续输入,因为它是当前年份。 2015。在此处加入当前日期有效性检查功能是必要的。

我已经到了这么远,但我需要帮助使它完全正常运行。 如果你想提供帮助,我可以告诉你一些我创建的代码。

3 个答案:

答案 0 :(得分:5)

有一些工具旨在提供比正则表达式处理更多的价值。

要使用的工具是DateTime,其ParseExact具有适当的日期格式规范来进行转换。

以下是评论中结果的四个示例:

DateTime.ParseExact("01/02/15", "MM/dd/yy", CultureInfo.InvariantCulture)
        .ToString("MM/dd/yyyy"); // 01/02/2015

DateTime.ParseExact("01/02/93", "MM/dd/yy", CultureInfo.InvariantCulture)
        .ToString("MM/dd/yyyy"); // 01/02/1993

DateTime.ParseExact("01/02/00", "MM/dd/yy", CultureInfo.InvariantCulture)
        .ToString("MM/dd/yyyy"); // 01/02/2000

 DateTime.ParseExact("01/02/09", "MM/dd/yy", CultureInfo.InvariantCulture)
         .ToString("MM/dd/yyyy") // 01/02/2009

答案 1 :(得分:3)

我非常喜欢正则表达式并且几乎在所有地方使用它们,但在这种情况下,它不是我推荐的方式(除非你想为学术目的这样做)。

我会使用DateTime.TryParseDateTime.TryParseExact

你要写的第一件事是:

Console.WriteLine("Enter the date:");
string dateString = Console.ReadLine();
DateTime date;

if(!DateTime.TryParseExact(dateString, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
    throw new InvalidOperationException("Not a valid date");
}
Console.WriteLine(date.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture));
// dateString = "17/04/88" => 17/04/1988
// dateString = "17/04/1988" => "Not a valid date"

.NET Fiddle

这很好,但等待,如果有人输入dd/MM/yyyy格式的日期,则会失败。 TryParseExect方法使用string[]进行重载,您可以在其中指定多种格式

Console.WriteLine("Enter the date (you can write it in the dd/MM/yyyy format):");
string dateString = Console.ReadLine();
DateTime date;

if (!DateTime.TryParseExact(dateString, new string[] { "dd/MM/yyyy", "dd/MM/yy" }, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
    throw new InvalidOperationException("Not a valid date");
}
Console.WriteLine(date.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture));
// dateString = "17/04/1988" => "17/04/1988"
// dateString = "17/04/29" => 17/04/2029
// dateString = "17/04/30" => 17/04/1930

.NET Fiddle

这很好,但等待,如果有人出生在17/04/29,它会显示17/04/2029,这是将来的! 如果有人在2029年读过这篇文章,请注意它是在2015年写的。

这是因为Calendar.TwoDigitYearMax Property

  

此属性允许将2位数年份正确翻译为a   4位数年份。例如,如果此属性设置为2029,则   100年的范围是从1930年到2029年。因此,2位数值为30   被解释为1930年,而2位数值29被解释为   2029。

目前,该属性默认为2029,我不确定达到此日期时会采取什么措施,可能是Year 2029 problem

你可以再次改进,但没有魔力,你必须做出选择,因为你已经知道,除非你做出假设,否则无法解决2位数年。

所以你需要的是回答以下问题:

1)我想要解决的日期范围是多少?>从CurrentYear - 99CurrentYear

如果是,我们可以这样写:

// Execution date: 18/06/2015
Console.WriteLine("Enter the date (if you want to enter a date from more than 99 years ago, you can enter the date in the dd/MM/yyyy format):");
string dateString = Console.ReadLine();
DateTime date;
CultureInfo ci = (CultureInfo)CultureInfo.InvariantCulture.Clone();
ci.Calendar.TwoDigitYearMax = DateTime.Now.Year;

if(!DateTime.TryParseExact(dateString, new string[] { "dd/MM/yyyy", "dd/MM/yy" }, ci, DateTimeStyles.None, out date))
{
    throw new InvalidOperationException("Not a valid date");
}
Console.WriteLine(date.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture));
// dateString = "17/04/15" => 17/04/2015
// dateString = "17/04/16" => 17/04/1916

.NET Fiddle

2)我们在谈论生日,对吧? 我们真的需要管理不到1岁的人吗?

或者,如果您的生日用于系统,您可以说,例如,某人不可能少于16岁,您可以更改此范围以处理从CurrentYear - 99 - 16到{{的日期1}}。
这样你就可以管理16到115年的人。

CurrentYear - 16

.NET Fiddle

就这篇文章而言,您可以继续自定义它,例如:

  • 能够配置最低年龄
  • 添加支票以验证日期不在将来(如果您输入// Execution date: 18/06/2015 Console.WriteLine("Enter your birth date (if you are less than 16 year old you have to wait, if you are very old you can try to enter your birthdate in the dd/MM/yyyy format):"); string dateString = Console.ReadLine(); DateTime date; CultureInfo ci = (CultureInfo)CultureInfo.InvariantCulture.Clone(); ci.Calendar.TwoDigitYearMax = DateTime.Now.Year - 16; if (!DateTime.TryParseExact(dateString, new string[] { "dd/MM/yyyy", "dd/MM/yy" }, ci, DateTimeStyles.None, out date)) { throw new InvalidOperationException("Not a valid date"); } Console.WriteLine(date.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture)); // dateString = "17/04/99" => 17/04/1999 // dateString = "17/04/16" => 17/04/1900 ,则上述代码仍然有效)

答案 2 :(得分:2)

可能是这样的:

string pattern = "\D\d{2}$"

shortYear.Replace(pattern, FullYear);

string FullYear(string value)
{
    string seperator = value.Substring(0,1);
    value = value.Substring(1,2);

    if(int32.Parse(value) < int32.Parse(DateTime.Now.Year.ToString().Substring(value.Length -2, 2))
        return seperator + DateTime.Now.Year.ToString().Substring(0, value.Length -2) + value;
    return seperator + (DateTime.Now.Year - 100).ToString().Substring(0, value.Length -2) + value;
}