试图弄清楚如何为出生日期添加世纪前缀(19或20)。有谁看到如何更好地编写此代码?
public string GetCenturyPrefix(string socSecNo)
{
string prefix = string.Empty;
try
{
var currentDate = DateTime.Now;
var birthDayTemp = socSecNo.Substring(0, 6);
var yy = birthDayTemp.Substring(0, 2);
var mm = birthDayTemp.Substring(2, 2);
var dd = birthDayTemp.Substring(4, 2);
birthDayTemp = yy + "-" + mm + "-" + dd;
var birthDay = Convert.ToDateTime(birthDayTemp);
var totalDays = currentDate - birthDay;
var age = totalDays.TotalDays / 365;
var yearsAfter2000 = Convert.ToInt32(currentDate.Year.ToString().Substring(2, 2));
if (age > yearsAfter2000)
{
prefix = "19";
}
else
{
prefix = "20";
}
}
catch (Exception)
{
}
return prefix;
}
答案 0 :(得分:1)
请勿使用Substring
将字符串值解析为DateTime。 .Net具有非常强大的方法供您执行此转换。
这里我使用的是DateTime.TryParseExact()
,它可以让我指定我希望提供日期值的确切格式。该方法返回true或false,指示值是否为提供的格式。无需使用异常来控制逻辑流。
public string GetCenturyPrefix(string socSecNo)
{
// Check if you're able to parse the incoming value
// in the format "yyMMdd".
if (!DateTime.TryParseExact(socSecNo, "yyMMdd", CultureInfo.InvariantCulture,
DateTimeStyles.None, out DateTime parsedDateTime))
{
// Do something if the input can't be parsed in that format.
// In this example I'm throwing an exception, but you can also
// return an empty string.
throw new Exception("Not valid date format");
}
// Extract only the Year portion as a 4 digit string,
// and return the first 2 characters.
return parsedDateTime.ToString("yyyy").Substring(0, 2);
}
答案 1 :(得分:0)
您可以像(year/100)+1
一样进行操作,但是将{0:n0}
格式设置为.ToString("{0:n0}")
可能是逻辑,否则就可以保持这种状态。正如我在计算器上尝试过的那样,这应该适用于任何世纪。