Преобразование года из 4 цифр в 2 цифры и обратно в C#
Мой процессор кредитных карт требует, чтобы я отправил двузначный год с даты истечения срока действия кредитной карты. Вот как я сейчас обрабатываю:
- Я положил
DropDownList
4-значного года на странице. - Я подтверждаю дату истечения срока действия в
DateTime
поле, чтобы быть уверенным, что дата окончания срока действия, передаваемая процессору CC, не истекла. - Я отправляю двузначный год на процессор CC (по мере необходимости). Я делаю это с помощью подстроки значения из года DDL.
Есть ли способ конвертировать год с четырьмя цифрами в год с двумя цифрами. Я не вижу ничего на DateTime
объект. Или я должен просто продолжать обрабатывать это, как я?
16 ответов
Если вы создаете объект DateTime, используя даты истечения срока (месяц / год), вы можете использовать ToString() для вашей переменной DateTime следующим образом:
DateTime expirationDate = new DateTime(2008, 1, 31); // random date
string lastTwoDigitsOfYear = expirationDate.ToString("yy");
Изменить: будьте осторожны с вашими датами, если вы используете объект DateTime во время проверки. Если кто-то выберет 05/2008 в качестве срока действия своей карты, он истекает в конце мая, а не первого.
1-е решение (самое быстрое):
yourDateTime.Year % 100
2-е решение (на мой взгляд, более элегантное):
yourDateTime.ToString("yy")
Ответ уже дан. Но здесь я хочу кое-что добавить. Кто-то сказал, что это не работает.
Может быть, вы используете
DateTime.Now.Year.ToString("yy");
вот почему это не работает. Я тоже сделал ту же ошибку.
Измените это на
DateTime.Now.ToString("yy");
Это должно работать для вас:
public int Get4LetterYear(int twoLetterYear)
{
int firstTwoDigits =
Convert.ToInt32(DateTime.Now.Year.ToString().Substring(2, 2));
return Get4LetterYear(twoLetterYear, firstTwoDigits);
}
public int Get4LetterYear(int twoLetterYear, int firstTwoDigits)
{
return Convert.ToInt32(firstTwoDigits.ToString() + twoLetterYear.ToString());
}
public int Get2LetterYear(int fourLetterYear)
{
return Convert.ToInt32(fourLetterYear.ToString().Substring(2, 2));
}
Я не думаю, что есть какие-то специальные встроенные вещи в.NET.
Обновление: отсутствует проверка, которую вы, возможно, должны сделать. Проверка длины введенных переменных и т. Д.
Начиная с C # 6.0, вы можете использовать встроенное составное форматирование при интерполяции строк для всего, что обрабатывает C #, например для страницы MVC Razor.
DateTime date = DateTime.Now;
string myTwoDigitYear = $"{date:yy};
Никаких расширений не требуется. Вы можете использовать большинство стандартных строк формата даты и времени после двоеточия после любого допустимого объекта DateTime внутри фигурных скобок, чтобы использовать встроенное составное форматирование .
//using java script
var curDate = new Date();
var curYear = curDate.getFullYear();
curYear = curYear.toString().slice(2);
document.write(curYear)
//using java script
//using sqlserver
select Right(Year(getDate()),2)
//using sql server
//Using c#.net
DateTime dt = DateTime.Now;
string curYear = dt.Year.ToString().Substring(2,2).ToString() ;
//using c#.net
Используйте объект DateTime ToString с пользовательской строкой формата, например, myDate.ToString("MM/dd/yy").
Я видел, как некоторые системы решают, что отсечка составляет 75; 75+ - это 19xx, а ниже - 20xx.
На данный момент самый простой способ состоит в том, чтобы просто обрезать последние две цифры года. Для кредитных карт указание даты в прошлом не требуется, поэтому Y2K не имеет смысла. То же самое относится к тому, если ваш код все еще работает более 90 лет.
Я бы пошел дальше и сказал, что вместо того, чтобы использовать выпадающий список, пусть пользователь сам вводит год. Это распространенный способ сделать это, и большинство пользователей могут справиться с этим.
Ответ довольно прост:
DateTime Today = DateTime.Today; string zeroBased = Today.ToString ("yy-MM-dd");
Почему бы исходному выпадающему списку не быть двузначным значением? Кредитные карты покрывают только небольшой промежуток, если смотреть на год, особенно если поставщик CC уже принимает только 2 цифры.
DateTime.Now.Year - (DateTime.Now.Year / 100 * 100)
Работает на текущий год. + Изменить DateTime.Now.Year
заставить его работать еще на один год.
Это старый пост, но я подумал, что приведу пример, используя ExtensionMethod
(начиная с C# 3.0), так как это скроет реализацию и позволит использовать ее повсеместно в проекте, или заново создавать код снова или снова, или нужно знать какой-то служебный класс.
Методы расширения позволяют вам "добавлять" методы к существующим типам, не создавая новый производный тип, не перекомпилируя или иным образом не изменяя исходный тип. Методы расширения представляют собой особый вид статического метода, но они вызываются так, как если бы они были методами экземпляра в расширенном типе. Для клиентского кода, написанного на C# и Visual Basic, нет очевидной разницы между вызовом метода расширения и методами, которые фактически определены в типе.
public static class DateTimeExtensions
{
public static int ToYearLastTwoDigit(this DateTime date)
{
var temp = date.ToString("yy");
return int.Parse(temp);
}
}
Затем вы можете вызывать этот метод везде, где вы используете DateTime
объект, например...
var dateTime = new DateTime(2015, 06, 19);
var year = cob.ToYearLastTwoDigit();
Это, кажется, работает хорошо для меня.yourDateTime.ToString().Substring(2);
Вот ссылка на статью 4Guys о том, как вы можете отформатировать даты и время, используя метод ToString(), передав строку пользовательского формата.
http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=181
На всякий случай, если это исчезнет, вот один из примеров.
'Create a var. named rightNow and set it to the current date/time
Dim rightNow as DateTime = DateTime.Now
Dim s as String 'create a string
s = rightNow.ToString("MMM dd, yyyy")
Поскольку его ссылка не работает, здесь есть ссылка на класс DateTimeFormatInfo, который делает возможными эти параметры форматирования.
http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx
Возможно, немного более логично делать что-то подобное, чем использовать подстроку, но кто знает.
Даже если бы существовал встроенный способ, он не подтвердил бы его как большее, чем сегодня, и он бы очень мало отличался от вызова подстроки. Я бы не беспокоился об этом.