Преобразовать год из двух цифр в год из четырех цифр

Достаточно просто написать собственную функцию сравнения:

function compare(a,b) {
  if (a.last_nom < b.last_nom)
    return -1;
  if (a.last_nom > b.last_nom)
    return 1;
  return 0;
}

objs.sort(compare);

Или встроенный (c / o Marco Demaio):

objs.sort(function(a,b) {return (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0);} ); 
29
задан Mahmoud Al-Qudsi 24 May 2012 в 08:07
поделиться

16 ответов

.NET Framework имеет метод, который делает именно то, что вам нужно:

int fourDigitYear = CultureInfo.CurrentCulture.Calendar.ToFourDigitYear(twoDigitYear)

Таким образом, вы будете правильно придерживаться текущих региональных настроек, определенных в Панели управления (или групповой политике):

Regional settings

61
ответ дан Vedran 24 May 2012 в 08:07
поделиться

Этот метод может конвертировать последние двухлетние цифры кредитной карты в четыре года


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;
}
0
ответ дан Shiv 24 May 2012 в 08:07
поделиться

Мои два цента,

Учитывая возрастной диапазон = [18, 100+], две цифры года = 90, я могу сделать

current year - twoDigitsYear = 2018 - 90 = 1928, я получил 19, 28

, следовательно, 19 - это первые две цифры года рождения, а 28 - это возраст, который составляет
год = 1990, возраст = 28

Но это не сработает, когда возраст 0 и 100 включены в диапазон, то же самое с некоторыми другими ответами здесь.

0
ответ дан Beeing Jk 24 May 2012 в 08:07
поделиться

Это решение, которое мы используем для дат истечения срока действия, пользователь вводит MM и YY в отдельные поля. Это приводит к датам 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));
}
0
ответ дан tyler_mitchell 24 May 2012 в 08:07
поделиться

Чтобы изменить двухзначный год на четырехзначный текущий или более ранний -

year = year + (DateTime.Today.Year - DateTime.Today.Year%100);
if (year > DateTime.Today.Year)
                year = year - 100;
0
ответ дан Ellen22 24 May 2012 в 08:07
поделиться

Мой ответ не будет соответствовать вашему вопросу, но для кредитных карт я просто добавлю 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;
    }
0
ответ дан Pawel Cioch 24 May 2012 в 08:07
поделиться

Если рассчитывать на человека, ему, вероятно, не будет более 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;
0
ответ дан Mattias Engman 24 May 2012 в 08:07
поделиться

Попробуйте этот простой код

// Вызовите метод 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

}
0
ответ дан Ollie 24 May 2012 в 08:07
поделиться

У меня была похожая проблема, и она возникла ... 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;
}
0
ответ дан bizah 24 May 2012 в 08:07
поделиться

Реализация

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

Надеюсь, это поможет!

5
ответ дан KManohar 24 May 2012 в 08:07
поделиться

Может быть разумнее проверить tmpYear> currentYear% 100. Если это так, то это 19ХХ, иначе 20ХХ.

4
ответ дан Ponkadoodle 24 May 2012 в 08:07
поделиться

Вы также можете использовать метод 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/2828 00:00:00

Дата создания с годом = 29 - 01/02/2029 00:00:00

Дата создания дата с годом = 30 - 01/03/1930 00:00:00

Если вы хотите изменить поведение, вы можете создать культуру с годом, который вы хотите использовать в качестве сводного. В этой теме показан пример

DateTime.TryParse века управления C #

Но, как сказал Мартин, если вы хотите управлять периодом времени, который охватывает более 100 лет, есть это невозможно сделать только двумя цифрами.

6
ответ дан Community 24 May 2012 в 08:07
поделиться

Я думаю, что у Java есть хорошая реализация этого:

http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html#year

Люди редко указывают годы в будущем, используя двузначный код. Реализация Java справляется с этим, предполагая, что диапазон отстает от 80 лет и на 20 лет впереди текущего года. Итак, сейчас 30 будет 2030, а 31 - 1931. Кроме того, эта реализация является гибкой, изменяя ее диапазоны с течением времени, чтобы вам не приходилось менять код каждые десять лет или около того.

Я только что проверил, и Excel также использует те же правила для преобразования двухзначного года. 1/1/29 превращается в 01.01.2029. 1/1/30 превращается в 01.01.1930.

5
ответ дан jdmichal 24 May 2012 в 08:07
поделиться

Как только вы примете другие предложения относительно того, когда нужно перевернуть свои вековые предположения с 19 на 20, лучший из всех возможных миров включает обновление вашего источника данных раз и навсегда с помощью 4-значных лет, так что вы можете прекратить делать предположения все время.

7
ответ дан Joel Mueller 24 May 2012 в 08:07
поделиться

Учитывая, что в настоящее время есть живые люди, родившиеся до 1950 года, но никто не родился после 2010 года, ваше использование 50 в качестве точки переворота кажется нарушенным.

Не можете ли вы установить точку перегиба на «год сейчас» (т. Е. 10) в своем приложении для даты рождения? Даже тогда у вас будут проблемы с теми, кто родился до 1911 года ...

Нет идеального способа сделать это - вы создаете информацию из воздуха.

Я предположил, что DOB = дата рождения. Для других данных (скажем, срок погашения финансового инструмента) выбор может быть другим, но столь же несовершенным.

16
ответ дан martin clayton 24 May 2012 в 08:07
поделиться

Из любопытства, откуда вы берете эти данные? Из формы? В таком случае; Я просто попросил бы пользователя заполнить (или каким-либо образом выбрать) год четырьмя цифрами или получить возраст пользователя и месяц / день рождения, и использовать эти данные, чтобы выяснить, в каком году они родились. Таким образом, вам не придется беспокоиться об этой проблеме вообще:)

Редактировать: Использовать DateTime для работы с данными такого типа.

0
ответ дан Leif 24 May 2012 в 08:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: