web-dev-qa-db-fra.com

Conversion d'une année de 4 chiffres à 2 chiffres et retour en C #

Le processeur de ma carte de crédit nécessite l'envoi d'une année à deux chiffres à compter de la date d'expiration de la carte. Voici comment je traite actuellement:

  1. Je mets une DropDownList de l'année à 4 chiffres sur la page.
  2. Je valide la date d'expiration dans un champ DateTime pour m'assurer que la date d'expiration transmise au processeur CC n'est pas expirée.
  3. J'envoie une année à deux chiffres au processeur CC (selon les besoins). Je le fais via une sous-chaîne de la valeur de l'année DDL.

Existe-t-il une méthode permettant de convertir une année à quatre chiffres en une année à deux chiffres? Je ne vois rien sur l'objet DateTime. Ou devrais-je simplement continuer à le traiter tel que je suis?

47
Mike Wills

Si vous créez un objet DateTime en utilisant les dates d'expiration (mois/année), vous pouvez utiliser ToString () sur votre variable DateTime de la manière suivante:

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

Éditer: faites attention à vos dates si vous utilisez l’objet DateTime lors de la validation. Si quelqu'un choisit 05/2008 comme date d'expiration de sa carte, celle-ci expire à la fin du mois de mai et non le premier.

84
brock.holum

1ère solution (le plus rapide):

yourDateTime.Year % 100

2ème solution (plus élégante à mon avis):

yourDateTime.ToString("yy")
26
Zbigniew Wiadro

Cela devrait fonctionner pour vous:

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));
}

Je ne pense pas qu'il y ait des éléments intégrés spéciaux dans .NET.

Update : Il manque une validation que vous devriez peut-être faire. Validez la longueur des variables saisies, etc.

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

Fonctionne pour l'année en cours. Changez DateTime.Now.Year pour que cela fonctionne aussi pour une autre année. 

1
Phiplex

À ce stade, la méthode la plus simple consiste à tronquer les deux derniers chiffres de l’année. Pour les cartes de crédit, il est inutile d'avoir une date dans le passé, donc l'an 2000 n'a pas de sens. Il en va de même si votre code est toujours actif dans plus de 90 ans.

J'irais plus loin en disant qu'au lieu d'utiliser une liste déroulante, laissez l'utilisateur saisir lui-même l'année. C'est une façon courante de le faire et la plupart des utilisateurs peuvent le gérer.

1
NotMe

Utilisez l'objet DateTime ToString avec une chaîne de format personnalisée, telle que myDate.ToString ("MM/jj/aa"), par exemple.

1
ckramer

J'ai vu certains systèmes décider que le seuil est de 75; 75+ correspond à 19xx et ci-dessous à 20xx.

1
spoulson

Voici un lien vers un article de 4Guys expliquant comment formater des dates et des heures à l'aide de la méthode ToString () en transmettant une chaîne de format personnalisée.

http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=181

Au cas où cela disparaît, voici l'un des exemples.

'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")

Comme son lien est rompu, voici un lien vers la classe DateTimeFormatInfo qui rend ces options de formatage possibles.

http://msdn.Microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx

C'est probablement un peu plus logique de faire quelque chose comme ça plutôt que d'utiliser une sous-chaîne, mais qui sait.

0
Harv

Ceci est un ancien post, mais je pensais donner un exemple en utilisant un ExtensionMethod (depuis C # 3.0), car cela masquerait la mise en œuvre et permettrait une utilisation partout dans le projet ou une recréation répétée du code au courant d'une classe d'utilité.

Les méthodes d'extension vous permettent "d'ajouter" des méthodes aux types existants sans créer un nouveau type dérivé, recompiler ou autrement modifier le type d'origine. Les méthodes d'extension sont un type particulier de méthode statique, mais elles sont appelées comme si elles étaient des méthodes d'instance sur le type étendu. Pour le code client écrit en C # et Visual Basic, il n'y a pas de différence apparente entre l'appel d'une méthode d'extension et les méthodes qui sont réellement définies dans un type.

public static class DateTimeExtensions
    {
        public static int ToYearLastTwoDigit(this DateTime date)
        {
            var temp = date.ToString("yy");
            return int.Parse(temp);
        }
    }

Vous pouvez ensuite appeler cette méthode partout où vous utilisez un objet DateTime, par exemple ...

var dateTime = new DateTime(2015, 06, 19);
var year = cob.ToYearLastTwoDigit();
0
christiandev

La réponse est assez simple:

DateTime Today = DateTime.Today; String zeroBased = Today.ToString ("aa-MM-jj");

0
Iliass Nassibane

Pourquoi ne pas faire en sorte que la liste déroulante originale sur la page soit une valeur à 2 chiffres seulement? Les cartes de crédit ne couvrent qu'une petite partie de l'année, surtout si le fournisseur CC n'enregistre déjà que 2 chiffres.

0
Andrew Jahn

Cela semble bien fonctionner pour moi .yourDateTime.ToString().Substring(2);

0
John