Преобразование года из 4-значного числа в 2-значное и обратно в C#

StackOverflow https://stackoverflow.com/questions/115399

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Если вы создаете объект 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 есть какие-то специальные встроенные возможности.

Обновлять:Не хватает некоторой проверки, которую вам, возможно, следует сделать.Проверьте длину введенных переменных и т. д.

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

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

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

Я видел, как некоторые системы решали, что пороговое значение равно 75;75+ – это 19хх, ниже – 20хх.

//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.Now.Year - (DateTime.Now.Year / 100 * 100)

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

Почему бы не сделать так, чтобы исходное раскрывающееся меню на странице содержало только двухзначное значение?Кредитные карты охватывают лишь небольшой промежуток времени, если смотреть на год, особенно если поставщик CC уже принимает только 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

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

Это старый пост, но я решил привести пример с использованием 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();

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

ДатаВремя Сегодня = ДатаВремя.Сегодня;string ZeroBased = Today.ToString("гг-ММ-дд");

Кажется, у меня это работает нормально.yourDateTime.ToString().Substring(2);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top