Преобразование года из двух цифр в год из четырех цифр
Автор вопроса: Scott ChamberlainОтветов: 12
Это вопрос лучших практик. У меня есть служебная программа, которая принимает год из двух цифр в виде строки, и мне нужно преобразовать ее в год из четырех цифр в виде строки. прямо сейчас я делаю
//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);
Я уверен, что делаю это ужасно неправильно, есть указатели?
Я думаю, вам следует наугад выбирать между 19 и 20. Разве никто не научился из 2000 года не использовать двузначные годы? Joe Phillips 08.01.2010
Некоторые клиенты ‹strike› пока что не подозревают ‹/strike› требуют использования двухзначного числа лет. Ian Boyd 20.06.2010
Есть ли другая информация о дате в базе данных, которая может помочь? Возраст? Последний визит к ветеринару? Последнее изображение? Является живым? DOD Смерть? Надеюсь, вы сможете обновить базу данных. Jess 19.08.2010
В .NET framework есть метод, который делает именно то, что вы хотите:
int fourDigitYear = CultureInfo.CurrentCulture.Calendar.ToFourDigitYear(twoDigitYear)
Таким образом, вы будете правильно придерживаться текущих региональных настроек, определенных в Панели управления (или групповой политике):
Ответ 2 · рейтинг 16 · martin clayton
Учитывая, что есть живые люди, родившиеся до 1950 года, но ни один из которых не родился после 2010 года, использование числа 50 в качестве точки перелома кажется неправильным.
Что касается даты рождения, разве вы не можете установить точку переключения на "текущий год" (т. Е. 10) в своем приложении? Даже тогда у вас будут проблемы с теми, кто родился до 1911 года ...
Для этого нет идеального способа - вы создаете информацию из воздуха.
Я предположил, что DOB = дата рождения. Для других данных (например, зрелости финансового инструмента) выбор может быть другим, но столь же несовершенным.
Ответ 3 · рейтинг 7 · FrenchData
Вы также можете использовать метод 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
Если вы хотите изменить поведение, вы можете создать культуру с годом, который вы хотите использовать в качестве опорного. Эта ветка показывает пример
Люди редко указывают годы в далеком будущем, используя двузначный код. Реализация Java справляется с этим, предполагая, что диапазон отстает на 80 лет и на 20 лет опережает текущий год. Итак, прямо сейчас 30 будет 2030, а 31 будет 1931. Кроме того, эта реализация является гибкой, изменяя свои диапазоны с течением времени, так что вам не нужно менять код каждые десять лет или около того.
Я только что протестировал, и Excel также использует те же правила для преобразования двухзначного года. 29.01.29 превращается в 01.01.2029. 01.01.30 превращается в 01.01.1930.
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 · Ponkadoodle
Возможно, будет разумнее проверить tmpYear> currentYear% 100. Если да, то это 19ХХ, иначе 20ХХ.
Ответ 7 · рейтинг 1 · tyler_mitchell
Это решение, которое мы используем для дат истечения срока, пользователь вводит 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));
}
Ответ 8 · рейтинг 1 · Shiv
Этот метод может преобразовать последние два года кредитной карты в четырехлетние цифры.
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;
}
Ответ 9 · Leif
Из любопытства, откуда вы берете эти данные? Из формы? В этом случае; Я бы просто попросил пользователя ввести (или как-то выбрать) год с четырьмя цифрами или получить возраст пользователя и месяц / день рождения и использовать эти данные, чтобы выяснить, в каком году они родились. Таким образом, вам вообще не придется беспокоиться об этой проблеме :)
Изменить: используйте DateTime для работа с такими данными.
Ответ 10 · Jags
Попробуйте этот простой код
// Вызов метода 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
}
Ответ 11 · bizah
Была аналогичная проблема, и я придумал это ... 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;
}
Ответ 12 · Pawel Cioch
Мой ответ не будет соответствовать вашему вопросу, но для кредитных карт я просто добавляю 2 цифры текущего года