C# 简化字符串拆分

C# 简化字符串拆分,c#,string,datetime,C#,String,Datetime,我从一个SQL查询中得到一个类似“PR242714031213”的结果。这基本上是一个字符串PR+ssmmhhdmmyy。我需要将其提取并格式化为一个简单的日期ddMMyyyy。 我正在使用以下代码段和正在工作的子字符串: string rawDate = (string)lastProjaddedDate.ExecuteScalar(); string year= rawDate.Substring(12,2); string month

我从一个SQL查询中得到一个类似“PR242714031213”的结果。这基本上是一个字符串PR+ssmmhhdmmyy。我需要将其提取并格式化为一个简单的日期ddMMyyyy。 我正在使用以下代码段和正在工作的子字符串:

 string rawDate =  (string)lastProjaddedDate.ExecuteScalar();
             string year= rawDate.Substring(12,2);
             string month=rawDate.Substring(10,2);
             string day=rawDate.Substring(8,2);
             string date = day + "/" + month + "/" +"20"+ year;
             Label4.Text =date;
我想知道我是否可以简化代码以获得ddMMyyyy

PS:我知道我需要改变它在数据库中的编码方式,以避免几十年后出现问题,但让我们开始简化它。

您可以:

Step - 1: Strip `PR` from the string
Step - 2: Parse to .Net `DateTime` object
Step - 3: Format to required format
代码:

string rawDate = "PR242714031213";
rawDate = rawDate.Substring(2);
DateTime dt;

if (!DateTime.TryParseExact(rawDate, 
                           "ssmmHHddMMyy", 
                           CultureInfo.InvariantCulture, 
                           DateTimeStyles.None, 
                           out dt))
{
    //invalid date
}

string formattedDate = dt.ToString("ddMMyyyy");
在一项声明中,它将是:

string formattedDate = DateTime.ParseExact(rawDate.Substring(2),
                            "ssmmHHddMMyy",
                             CultureInfo.InvariantCulture)
                            .ToString("ddMMyyy");

假设您更新了数据库中存储日期的方式,那么您只需要:

DateTime.ParseExact(rawDate.Substring(2), "ssmmHHddMMyyyy", CultureInfo.InvariantCulture).ToString("ddMMyyyy");
否则,请暂时使用以下方法:

DateTime.ParseExact(rawDate.Substring(2), "ssmmHHddMMyy", CultureInfo.InvariantCulture).ToString("ddMMyyyy");

在任何情况下,您都可以在
ToString()
方法中选择所需的任何格式。

正则表达式将为您提供简洁的代码和验证:

var match = Regex.Match(rawDate, @"PR\d{6}(?<d>\d\d)(?<m>\d\d)(?<y>\d\d)");
string date = match.Groups["d"].Value + "/" + match.Groups["m"].Value + "/20" + match.Groups["y"].Value;
var match=Regex.match(rawDate,@“PR\d{6}(?\d\d)(?\d\d)(?\d\d)”);
字符串日期=match.Groups[“d”].值+“/”+匹配.Groups[“m”].值+“/20”+匹配.Groups[“y”]值;

因为使用
DateTime.TryParseExact
也意味着您可以从日期验证中获益(例如,确保您不会得到2月30日)。Jurgen、millennium和centuries不在查询结果中。所以我不能这么做。为你的特定场景编辑它。叹气。这是一个坏的数据库模式设计。任何日期都应该是日期中的一个column@JoelCoehoorn,在处理其他代码以修复它时发生。