Conversione di un anno da 4 cifre a 2 cifre e ritorno in C #
-
02-07-2019 - |
Domanda
L'elaboratore della mia carta di credito richiede che invii un anno a due cifre dalla data di scadenza della carta di credito. Ecco come sto attualmente elaborando:
- Ho inserito un
DropDownList
dell'anno a 4 cifre sulla pagina. - Convalido la data di scadenza in un campo
DateTime
per essere sicuro che la data di scadenza che viene passata al processore CC non sia scaduta. - Invio un anno a due cifre al processore CC (come richiesto). Lo faccio tramite una sottostringa del valore dell'anno DDL.
Esiste un metodo per convertire un anno a quattro cifre in un anno a due cifre. Non vedo nulla sull'oggetto DateTime
. O dovrei continuare a elaborarlo così com'è?
Soluzione
Se stai creando un oggetto DateTime usando le date di scadenza (mese / anno), puoi usare ToString () sulla tua variabile DateTime in questo modo:
DateTime expirationDate = new DateTime(2008, 1, 31); // random date
string lastTwoDigitsOfYear = expirationDate.ToString("yy");
Modifica: fai attenzione alle tue date se usi l'oggetto DateTime durante la validazione. Se qualcuno seleziona 05/2008 come data di scadenza della sua carta, scade alla fine di maggio, non alla prima.
Altri suggerimenti
1a soluzione (più veloce):
yourDateTime.Year % 100
2a soluzione (più elegante secondo me):
yourDateTime.ToString("yy")
La risposta è già stata fornita. Ma qui voglio aggiungere qualcosa. Qualcuno ha detto che non ha funzionato.
Forse stai usando
DateTime.Now.Year.ToString (" yy ");
ecco perché non funziona. Ho anche fatto lo stesso errore.
Cambialo in
DateTime.Now.ToString (" yy ");
Questo dovrebbe funzionare per te:
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));
}
Non credo che ci siano elementi integrati speciali in .NET.
Aggiorna : manca qualche convalida che forse dovresti fare. Convalida della lunghezza delle variabili immesse e così via.
A questo punto, il modo più semplice è quello di troncare le ultime due cifre dell'anno. Per le carte di credito, avere una data nel passato non è necessario, quindi Y2K non ha alcun significato. Lo stesso vale se in qualche modo il tuo codice è ancora in esecuzione da oltre 90 anni.
Andrei oltre e direi che invece di utilizzare un elenco a discesa, consenti all'utente di digitare l'anno stesso. Questo è un modo comune di farlo e la maggior parte degli utenti può gestirlo.
Usa l'oggetto DateTime ToString con una stringa di formato personalizzata come myDate.ToString (" MM / dd / yy ") per esempio.
Ho visto alcuni sistemi decidere che il cutoff è 75; 75+ è 19xx e inferiore è 20xx.
//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)
Funziona per l'anno in corso. Modifica DateTime.Now.Year
per farlo funzionare anche per un altro anno.
Perché il menu a discesa originale nella pagina non deve contenere solo un valore di 2 cifre? Le carte di credito coprono solo un piccolo arco di tempo, soprattutto se il fornitore CC accetta solo 2 cifre.
Ecco un link ad un articolo di 4Guys su come formattare date e orari usando il metodo ToString () passando una stringa di formato personalizzata.
http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp ? faqid = 181
Nel caso in cui scompaia ecco uno degli esempi.
'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")
Poiché il suo collegamento è interrotto qui c'è un collegamento alla classe DateTimeFormatInfo che rende possibili queste opzioni di formattazione.
http://msdn.microsoft.com/en -us / library / system.globalization.datetimeformatinfo.aspx
Probabilmente è un po 'più coerente fare qualcosa del genere piuttosto che usare una sottostringa, ma chi lo sa.
Questo è un vecchio post, ma ho pensato di fare un esempio usando un ExtensionMethod
(dal C # 3.0), poiché questo nasconderà l'implementazione e ne consentirà l'utilizzo ovunque nel progetto invece o ricreare il codice più e più volte o è necessario conoscere alcune classi di utilità.
I metodi di estensione ti consentono di " aggiungere " metodi per tipi esistenti senza creare un nuovo tipo derivato, ricompilare o altrimenti modifica del tipo originale. I metodi di estensione sono un tipo speciale di metodo statico, ma vengono chiamati come se fossero metodi di istanza attivi il tipo esteso. Per il codice client scritto in C # e Visual Basic, non vi è alcuna differenza apparente tra la chiamata di un metodo di estensione e i metodi che sono effettivamente definiti in un tipo.
public static class DateTimeExtensions
{
public static int ToYearLastTwoDigit(this DateTime date)
{
var temp = date.ToString("yy");
return int.Parse(temp);
}
}
Puoi quindi chiamare questo metodo ovunque usi un oggetto DateTime
, ad esempio ...
var dateTime = new DateTime(2015, 06, 19);
var year = cob.ToYearLastTwoDigit();
La risposta è abbastanza semplice:
DateTime Today = DateTime.Today; stringa zeroBased = Today.ToString (" yy-MM-dd ");
Questo sembra funzionare bene per me.
yourDateTime.ToString () substring (2);.
Anche se esistesse un modo incorporato, non lo convaliderebbe come maggiore di oggi e differirebbe molto poco da una chiamata di sottostringa. Non me ne preoccuperei.