这是最佳做法的问题。我有一个实用程序,它将一个两位数的年份作为字符串,我需要将其转换为四位数年份作为字符串。现在我做
//DOB's format is "MMM (D)D YY" that first digit of the day is not there for numbers 1-9
string tmpYear = rowIn.DOB.Substring(rowIn.DOB.Length - 3, 2); //-3 because it is 0 indexed
if (Convert.ToInt16(tmpYear) > 50)
tmpYear = String.Format("19{0}", tmpYear);
else
tmpYear = String.Format("20{0}", tmpYear);
我确信我做错了,任何指针?
答案 0 :(得分:60)
.NET框架有一个完全按照你想要的方法:
int fourDigitYear = CultureInfo.CurrentCulture.Calendar.ToFourDigitYear(twoDigitYear)
这样您就可以正确遵守控制面板(或组策略)中定义的当前区域设置:
答案 1 :(得分:16)
鉴于现在有人活着,现在出生在1950年之前,但没有一个人在2010年之后出生,你使用50作为翻转点似乎被打破了。
对于出生日期,您是否可以在应用中将翻转点设置为“现在的年份”(即10)?即便如此,你在1911年之前出生的人也会遇到问题......
没有完美的方法可以做到这一点 - 你是凭空创造信息的。
我假设DOB =出生日期。对于其他数据(例如,金融工具的到期日),选择可能会有所不同,但同样不完善。
答案 2 :(得分:7)
一旦你采取了其他建议,将你的世纪假设从19改为20,那么所有可能世界中最好的一个就是一劳永逸地更新你的数据源,所以你可以停止制作一直都是假设。
答案 3 :(得分:6)
您还可以使用DateTime.TryParse方法转换日期。它使用当前文化设置来定义透视年份(在我的情况下是2029)
DateTime resultDate;
Console.WriteLine("CultureInfo.CurrentCulture.Calendar.TwoDigitYearMax : {0}", System.Globalization.CultureInfo.CurrentCulture.Calendar.TwoDigitYearMax);
DateTime.TryParse("01/01/28", out resultDate);
Console.WriteLine("Generated date with year=28 - {0}",resultDate);
DateTime.TryParse("01/02/29",out resultDate);
Console.WriteLine("Generated date with year=29 - {0}", resultDate);
DateTime.TryParse("01/03/30", out resultDate);
Console.WriteLine("Generated date with year=30 - {0}", resultDate);
输出结果为:
CultureInfo.CurrentCulture.Calendar.TwoDigitYearMax:2029
生成日期,年份为28 - 01/01/2028 00:00:00
生成日期,年份= 29 - 01/02/2029 00:00:00
生成日期,年份= 30 - 01/03/1930 00:00:00
如果要更改行为,可以使用要作为数据透视的年份创建文化。这个帖子显示了一个例子
DateTime.TryParse century control C#
但正如马丁所说,如果你想管理一个超过100年的时间段,那么只有2位数就无法做到。
答案 4 :(得分:5)
我认为Java有很好的实现:
http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html#year
人们很少使用两位数代码指定未来几年。 Java实现通过假设落后80年并比当前提前20年来处理这个问题。所以现在,30将是2030年,而31将是1931年。此外,这种实现是灵活的,随着时间的推移修改其范围,因此您不必每十年左右更改一次代码。
我刚刚测试过,Excel也使用这些相同的规则进行2位数年份转换。 1/1/29变成1/1/2029。 1/1/30变成1930年1月1日。
答案 5 :(得分:5)
的实施
System.Globalization.CultureInfo.CurrentCulture.Calendar.ToFourDigitYear
是
public virtual int ToFourDigitYear(int year)
{
if (year < 0)
throw new ArgumentOutOfRangeException("year", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (year < 100)
return (this.TwoDigitYearMax / 100 - (year > this.TwoDigitYearMax % 100 ? 1 : 0)) * 100 + year;
else
return year;
}
希望这有帮助!
答案 6 :(得分:4)
检查tmpYear&gt;可能更聪明。 currentYear%100。如果是,那么它是19XX,否则是20XX。
答案 7 :(得分:0)
int fYear = Convert.ToInt32(txtYear.Value.ToString().Substring(2, 2));
答案 8 :(得分:0)
基于上述解决方案,这是我的,我在使用java时在android中使用
它以两位数字格式显示当前年份,然后检查是否输入 年的长度等于2,如果是,则它得出当前年份并从 今年它分裂了世纪的前两位数,然后加上了 用户输入的世纪。使其成为4位数的年份。
public static int getConvertedYearFromTwoToFourDigits(String year) {
if (year.length() == 2) {
int currentYear = Calendar.getInstance().get(Calendar.YEAR);
String firstTwoDigitsOfCurrentYear = String.valueOf(currentYear).substring(0, 2);
year = firstTwoDigitsOfCurrentYear + year;
}
return Integer.parseInt(year);
}
答案 9 :(得分:0)
此方法可以将信用卡的前两年数字转换为四年
private static int ToFourDigitYear(int year)
{
string stringYear = year.ToString("00");
if (stringYear.Length == 2)
{
int currentYear = DateTime.Now.Year;
string firstTwoDigitsOfCurrentYear = currentYear.ToString().Substring(0, 2);
year = Convert.ToInt32(firstTwoDigitsOfCurrentYear + stringYear);
if (year < currentYear)
year = year + 100;
}
return year;
}
答案 10 :(得分:0)
我的两分钱,
鉴于年龄范围= [18,100 +],两位数年份= 90,我可以
current year - twoDigitsYear
= 2018 - 90 = 1928
,我得到了19,28
但是当年龄0和100都包含在范围内时,它不会起作用,与其他一些答案相同。
答案 11 :(得分:0)
我们用于到期日期的解决方案,用户将MM和YY输入到单独的字段中。这导致2月份的日期分别为31或30日,28日或29日。
/// <summary>
/// Creates datetime for current century and sets days to end of month
/// </summary>
/// <param name="MM"></param>
/// <param name="YY"></param>
/// <returns></returns>
public static DateTime GetEndOfMonth(string MM, string YY)
{
// YY -> YYYY #RipVanWinkle
// Gets Current century and adds YY to it.
// Minus 5 to allow dates that may be expired to be entered.
// eg. today is 2017, 12 = 2012 and 11 = 2111
int currentYear = DateTime.Now.Year;
string thisYear = currentYear.ToString().Substring(0, 2) + YY;
int month = Int32.Parse(MM);
int year = Int32.Parse(thisYear);
if ((currentYear - 5) > year)
year += 100;
return new DateTime(year, month, DateTime.DaysInMonth(year, month));
}
答案 12 :(得分:0)
将2位数年份更改为4位数或更早 -
year = year + (DateTime.Today.Year - DateTime.Today.Year%100);
if (year > DateTime.Today.Year)
year = year - 100;
答案 13 :(得分:0)
如果你算一个人,他可能不会超过100年......
例如:751212
var nr = "751212";
var century = DateTime.Now.AddYears(-100).Year.ToString().Substring(0, 2);
var days = (DateTime.Now - DateTime.Parse(century + nr)).Days;
decimal years = days / 365.25m;
if(years>=99)
century = DateTime.Now.Year.ToString().Substring(0, 2);
var fullnr = century+nr;
答案 14 :(得分:0)
我的回答与您的问题不符,但对于信用卡,我只需添加当前年份的2位数
private int UpconvertTwoDigitYearToFour(int yearTwoOrFour)
{
try
{
if (yearTwoOrFour.ToString().Length <= 2)
{
DateTime yearOnly = DateTime.ParseExact(yearTwoOrFour.ToString("D2"), "yy", null);
return yearOnly.Year;
}
}
catch
{
}
return yearTwoOrFour;
}
答案 15 :(得分:0)
有类似的问题,想出了这个...... HTH!
value = this.GetDate()
if (value.Length >= 6)//ensure that the date is mmddyy
{
int year = 0;
if (int.TryParse(value.Substring(4, 2), out year))
{
int pastMillenium = int.Parse(DateTime.Now.ToString("yyyy").Substring(0, 2)) - 1;
if (year > int.Parse(DateTime.Now.ToString("yy")))//if its a future year it's most likely 19XX
{
value = string.Format("{0}{1}{2}", value.Substring(0, 4), pastMillenium, year.ToString().PadLeft(2, '0'));
}
else
{
value = string.Format("{0}{1}{2}", value.Substring(0, 4), pastMillenium + 1, year.ToString().PadLeft(2, '0'));
}
}
else
{
value = string.Empty;
}
}
else
{
value = string.Empty;
}
答案 16 :(得分:0)
试试这个简单的代码
//调用TextBoxDateFormat方法,将日期作为参数。
方法
public void TextBoxDateFormat(string str1)
{
// Takes the current date format if MM/DD/YY or MM/DD/YYYY
DateTime dt = Convert.ToDateTime(str1);
//Converts the requested date into MM/DD/YYYY and assign it to textbox field
TextBox = String.Format("{0:MM/dd/yyyy}", dt.ToShortDateString());
//include your validation code if required
}
答案 17 :(得分:0)
出于好奇,你从哪里获得这些数据?从形式?在这种情况下;我只是要求用户填写(或以某种方式选择)四位数的年份或获得用户的年龄和出生月份/日,并使用该数据来确定他们出生的年份。这样,您根本不必担心这个问题:)
修改:使用DateTime处理此类数据。