Преобразование года с 4 цифр на 2 цифры и обратно на С#

Мой процессор кредитных карт требует, чтобы я отправил двухзначный год с даты истечения срока действия кредитной карты. Вот как я сейчас обрабатываю:

  • Я положил DropDownList 4-значного года на странице.
  • Я проверяю дату истечения срока действия в поле DateTime, чтобы быть уверенным, что срок годности, передаваемый процессору CC, не истек.
  • Я посылаю двухзначный год процессору CC (по мере необходимости). Я делаю это через подстроку значения из DDL года.

Есть ли способ для преобразования четырехзначного года в двузначный год. Я ничего не вижу в объекте DateTime. Или я должен просто обрабатывать его так, как есть?

32
задан Mike Wills 22 сент. '08 в 18:12
источник поделиться

14 ответов

Если вы создаете объект DateTime, используя даты истечения срока (месяц/год), вы можете использовать ToString() в своей переменной DateTime так:

DateTime expirationDate = new DateTime(2008, 1, 31); // random date
string lastTwoDigitsOfYear = expirationDate.ToString("yy");

Изменить: будьте осторожны с датами, но если вы используете объект DateTime во время проверки. Если кто-то выбирает 05/2008 в качестве даты истечения срока действия карты, он истекает в конце мая, а не на первом.

65
ответ дан brock.holum 22 сент. '08 в 18:17
источник поделиться

1-е решение (самый быстрый):

yourDateTime.Year % 100

2-е решение (более элегантный, на мой взгляд):

yourDateTime.ToString("yy")
20
ответ дан Zbigniew Wiadro 21 мая '14 в 15:16
источник поделиться

Это должно сработать для вас:

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 есть специальные встроенные материалы.

Обновить. Это не позволяет проверить, что вы, возможно, должны сделать. Подтвердите длину введенных переменных и т.д.

5
ответ дан Seb Nilsson 22 сент. '08 в 18:22
источник поделиться

На этом этапе самым простым способом является просто усечение последних двух цифр года. Для кредитных карт наличие даты в прошлом не требуется, поэтому Y2K не имеет смысла. То же самое можно сказать о том, как-то ваш код все еще работает в течение 90 лет.

Я пошел дальше и скажу, что вместо того, чтобы использовать раскрывающийся список, пусть пользователь вводит сам год. Это общий способ сделать это, и большинство пользователей могут справиться с этим.

1
ответ дан NotMe 22 сент. '08 в 18:15
источник поделиться
//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
1
ответ дан V.K.D Baghel 16 апр. '11 в 12:52
источник поделиться

Используйте объект DateTime ToString с пользовательской строкой формата, например myDate.ToString( "MM/dd/yy" ).

1
ответ дан ckramer 22 сент. '08 в 18:17
источник поделиться
DateTime.Now.Year - (DateTime.Now.Year / 100 * 100)

Работает на текущий год. Измените DateTime.Now.Year, чтобы он работал еще год.

1
ответ дан Phiplex 04 июня '11 в 10:09
источник поделиться

Я видел, как некоторые системы решают, что обрезание составляет 75; 75+ - 19xx, а ниже - 20xx.

1
ответ дан spoulson 22 сент. '08 в 18:18
источник поделиться

Ответ довольно прост:

DateTime Today = DateTime.Today; string zeroBased = Today.ToString( "yy-MM-dd" );

0
ответ дан Quimson 25 окт. '16 в 11:22
источник поделиться

Ответ уже дан. Но здесь я хочу что-то добавить. Кто-то сказал, что это не сработало.

Возможно, вы используете

DateTime.Now.Year.ToString("yy");

поэтому он не работает. Я также сделал ту же ошибку.

Измените его на

DateTime.Now.ToString("yy");

0
ответ дан Sadid Khan 04 июня '17 в 21:12
источник поделиться

Вот ссылка на статью 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

Вероятно, немного более последовательным, чтобы сделать что-то подобное, а не использовать подстроку, но кто знает.

0
ответ дан Harv 22 сент. '08 в 18:24
источник поделиться

Это старый пост, но я подумал, что приведу пример с использованием ExtensionMethod (начиная с С# 3.0), так как это скроет реализацию и позволит использовать ее везде в проекте или воссоздать код поверх и над или нужно знать какой-либо класс полезности.

Методы расширения позволяют вам "добавлять" методы к существующим типам без создания нового производного типа, перекомпиляции или иного изменяя исходный тип. Методы расширения - это особый вид статический метод, но они вызываются так, как если бы они были методами экземпляра на расширенный тип. Для кода клиента, написанного на С# и 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();
0
ответ дан christiandev 19 июня '15 в 12:54
источник поделиться

Почему у вас нет первоначального раскрывающегося списка на странице только 2-значное значение? Кредитные карты охватывают только небольшой промежуток времени, если смотреть на год, особенно если поставщик CC принимает только 2 цифры.

0
ответ дан Andrew Jahn 22 сент. '08 в 18:15
источник поделиться

Даже если бы существовал встроенный способ, он не подтвердил бы его как больше, чем сегодня, и он будет очень мало отличаться от подстрочного вызова. Я бы не стал беспокоиться об этом.

-1
ответ дан Vinko Vrsalovic 22 сент. '08 в 18:15
источник поделиться

Другие вопросы по меткам