C# 将两位数年份转换为四位数年份

C# 将两位数年份转换为四位数年份,c#,string,date,C#,String,Date,这是一个最佳做法问题。我有一个实用程序,将两位数的年份作为字符串,我需要将其转换为四位数的年份作为字符串。现在我知道了 //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 (Conve

这是一个最佳做法问题。我有一个实用程序,将两位数的年份作为字符串,我需要将其转换为四位数的年份作为字符串。现在我知道了

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

我肯定我做得非常错误,有什么建议吗?

鉴于现在有人出生在1950年之前,但没有人出生在2010年之后,你用50作为转折点似乎是不正确的

对于出生日期,您能否在应用程序中将翻转点设置为“现在的年份”(即10)?即使那样,你也会遇到1911年以前出生的人的问题

没有完美的方法可以做到这一点——你只是凭空创造信息


我假设DOB=出生日期。对于其他数据(例如,金融工具的到期日),选择可能不同,但同样不完美。

检查tmpYear>currentYear%100可能更明智。如果是,那么是19XX,否则是20XX。

我认为Java很好地实现了这一点:

人们很少使用两位数代码来指定未来的年份。Java实现通过假设当前年份落后80年,提前20年来处理这个问题。所以现在,30个是2030年,31个是1931年。此外,这个实现是灵活的,随着时间的推移修改它的范围,这样您就不必每隔十年左右更改一次代码


我刚刚测试过,Excel也使用同样的规则进行2位数的年转换。29年1月1日变为2029年1月1日。1930年1月1日变成1930年1月1日。

出于好奇,你从哪里获得这些数据?从一张表格?在这种情况下;我会简单地要求用户用四位数字填写(或以某种方式选择)年份,或者获得用户的年龄和出生月份/天,并使用这些数据计算出他们出生的年份。这样,您就不必担心这个问题:)


编辑:用于处理此类数据。

您还可以使用DateTime.TryParse方法转换日期。它使用当前区域性设置来定义轴心年(在我的例子中是2029年)

输出为:

CultureInfo.CurrentCulture.Calendar.TwoDigitYearMax:2029

生成日期,年份=28-2028年1月1日00:00:00

生成日期,年份=29-2029年1月2日00:00:00

生成日期,年份=30-1930年3月1日00:00:00

如果要更改行为,可以创建一个文化氛围,以您要使用的年份作为轴心。此线程显示了一个示例

但是正如martin所说,如果你想管理一个跨越100年以上的时间段,没有办法只使用2位数字

//以日期为参数调用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

}

有一个类似的问题,并提出了这个。。。嗯

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

.NET framework有一种方法可以完全满足您的要求:

int fourDigitYear = CultureInfo.CurrentCulture.Calendar.ToFourDigitYear(twoDigitYear)
这样,您将正确遵守控制面板(或组策略)中定义的当前区域设置:


我的答案与你的问题不符,但对于信用卡,我只添加了当前年份的两位数

    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;
    }
private int-UpconvertTwoDigitYearToFour(int-yearTwoOrFour)
{
尝试
{
if(yearTwoOrFour.ToString().Length的实现

System.Globalization.CultureInfo.CurrentCulture.Calendar.ToFourDigitYear 

公共虚拟整数到四位数年(整数年)
{
如果(年份<0)
抛出新ArgumentOutOfRangeException(“year”,Environment.GetResourceString(“ArgumentOutOfRange_NeedNonNegNum”);
如果(年份<100)
返回(this.TwoDigitYearMax/100-(year>this.TwoDigitYearMax%100?1:0))*100+年;
其他的
回归年;
}

希望这有帮助!

如果你计算一个人的寿命,他可能不会超过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;

将2位数年份更改为4位数当前年份或更早-

year = year + (DateTime.Today.Year - DateTime.Today.Year%100);
if (year > DateTime.Today.Year)
                year = year - 100;

我们使用的这个解决方案用于过期日期,用户在单独的字段中输入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));
}
//
///为当前世纪创建日期时间,并将日期设置为月底
/// 
/// 
/// 
/// 
公共静态日期时间GetEndOfMonth(字符串MM,字符串YY)
{
//YY->YYYY#RipVanWinkle
//获取当前世纪并向其添加YY。
//减5以允许输入可能过期的日期。
//今天是2017年,12=2012年,11=2111年
int currentYear=DateTime.Now.Year;
string thisYear=currentYear.ToString().Substring(0,2)+YY;
int month=Int32.Parse(MM);
int year=Int32.Parse(今年);
如果((当前年份-5)>年份)
年份+=100;
返回新的DateTime(年、月、DateTime.DaysInMonth(年、月));
}
我的两分钱

考虑到年龄范围=[18100+],两位数年份=90,我能做到

本年度-twodigitswear
=
2018-90=1928
,我得到19,28

因此,19是出生年份的前两位数,28是年龄,即
年份=1990年,年龄=28岁


但是,当0岁和100岁都包含在这个范围内时,它就不起作用了,这与这里的一些其他答案相同。

这种方法可以将信用卡最后两年的数字转换为四年的数字


私有静态整数到四位数年(整数年)
{
字符串stringYear=year.ToString(“00”);
如果(stringYear.Length==2)
{
int currentYear=DateTime.Now.Year;
字符串firstTwoDigitsOfCurrentYear=currentYear.ToString().Substring(0,2);
年份=转换为32(当前年份的前两位数+字符串年份);
如果(年<当前年)
年份=年份+100;
}
回归年;
}

基于上述解决方案,这里是我的,我在使用java时在android中使用

它以两位数的格式获取当前年份,然后检查是否输入 年份长度等于2,如果是,则得到当前年份和 今年,它将世纪的前两位数字分开,然后再加上这个数字 世纪与年用户输入。使其成为4位数的年


我认为你应该随机选择
year = year + (DateTime.Today.Year - DateTime.Today.Year%100);
if (year > DateTime.Today.Year)
                year = year - 100;
/// <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));
}
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;
}
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);
    }
 int fYear = Convert.ToInt32(txtYear.Value.ToString().Substring(2, 2));