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

本文关键字:dd mm 转换 yyyy yy 正则表达式 | 更新日期: 2023-09-27 17:56:43

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

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

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

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

我已经走到了这一步,但我需要帮助使其完全发挥作用。如果你想帮忙,我可以向你展示我创建的一些代码。

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

有一些工具旨在做到这一点,它们提供比正则表达式处理更多的价值。

要使用的工具与其具有适当日期格式规范的 ParseExact DateTime,以进行对话。

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

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

我真的很喜欢正则表达式,并且几乎在任何地方都使用它们,但在这种情况下,这不是我推荐的方式(除非你想出于学术目的这样做)。

我会使用 DateTime.TryParse 或 DateTime.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 小提琴


这很好,但是等等,如果有人以格式输入日期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 小提琴


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

这是因为 Calendar.TwoDigitYearMax 属性

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

目前,该属性默认为 2029 年,我不确定到达此日期后会做什么,也许是 2029 年的问题?


您可以再次改进它,但没有魔法,您将不得不做出选择,因为正如您已经知道的那样,除非您做出假设,否则 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 小提琴


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

或者,如果您的出生日期用于系统中,例如,某人不可能小于 16 岁,您可以更改此范围以处理从 CurrentYear - 99 - 16CurrentYear - 16 的日期。
这样您就可以管理16至115岁的人。

// 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

.NET 小提琴

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

  • 能够配置最低年龄
  • 添加检查以验证日期是否在未来(如果您输入 31/12/<TwoDigitYearMax> ,它仍然对上述代码有效)

也许是这样的:

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;
}