Достаточно просто написать собственную функцию сравнения:
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);} );
.NET Framework имеет метод, который делает именно то, что вам нужно:
int fourDigitYear = CultureInfo.CurrentCulture.Calendar.ToFourDigitYear(twoDigitYear)
Таким образом, вы будете правильно придерживаться текущих региональных настроек, определенных в Панели управления (или групповой политике):
Этот метод может конвертировать последние двухлетние цифры кредитной карты в четыре года
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;
}
Мои два цента,
Учитывая возрастной диапазон = [18, 100+], две цифры года = 90, я могу сделать
current year - twoDigitsYear
= 2018 - 90 = 1928
, я получил 19, 28
, следовательно, 19 - это первые две цифры года рождения, а 28 - это возраст, который составляет
год = 1990, возраст = 28
Но это не сработает, когда возраст 0 и 100 включены в диапазон, то же самое с некоторыми другими ответами здесь.
Это решение, которое мы используем для дат истечения срока действия, пользователь вводит 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));
}
Чтобы изменить двухзначный год на четырехзначный текущий или более ранний -
year = year + (DateTime.Today.Year - DateTime.Today.Year%100);
if (year > DateTime.Today.Year)
year = year - 100;
Мой ответ не будет соответствовать вашему вопросу, но для кредитных карт я просто добавлю 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;
}
Если рассчитывать на человека, ему, вероятно, не будет более 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;
Попробуйте этот простой код
// Вызовите метод 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
}
У меня была похожая проблема, и она возникла ... 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;
}
Реализация
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;
}
Надеюсь, это поможет!
Может быть разумнее проверить tmpYear> currentYear% 100. Если это так, то это 19ХХ, иначе 20ХХ.
Вы также можете использовать метод 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 лет, есть это невозможно сделать только двумя цифрами.
Я думаю, что у 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.
Как только вы примете другие предложения относительно того, когда нужно перевернуть свои вековые предположения с 19 на 20, лучший из всех возможных миров включает обновление вашего источника данных раз и навсегда с помощью 4-значных лет, так что вы можете прекратить делать предположения все время.
Учитывая, что в настоящее время есть живые люди, родившиеся до 1950 года, но никто не родился после 2010 года, ваше использование 50 в качестве точки переворота кажется нарушенным.
Не можете ли вы установить точку перегиба на «год сейчас» (т. Е. 10) в своем приложении для даты рождения? Даже тогда у вас будут проблемы с теми, кто родился до 1911 года ...
Нет идеального способа сделать это - вы создаете информацию из воздуха.
Я предположил, что DOB = дата рождения. Для других данных (скажем, срок погашения финансового инструмента) выбор может быть другим, но столь же несовершенным.
Из любопытства, откуда вы берете эти данные? Из формы? В таком случае; Я просто попросил бы пользователя заполнить (или каким-либо образом выбрать) год четырьмя цифрами или получить возраст пользователя и месяц / день рождения, и использовать эти данные, чтобы выяснить, в каком году они родились. Таким образом, вам не придется беспокоиться об этой проблеме вообще:)
Редактировать: Использовать DateTime для работы с данными такого типа.