Pregunta

El procesador de mi tarjeta de crédito requiere que envíe un año de dos dígitos a partir de la fecha de vencimiento de la tarjeta de crédito.Así es como estoy procesando actualmente:

  1. Yo puse un DropDownList del año de 4 dígitos en la página.
  2. Valido la fecha de vencimiento en un DateTime para asegurarse de que la fecha de vencimiento que se pasa al procesador CC no esté vencida.
  3. Envío un año de dos dígitos al procesador CC (según sea necesario).Hago esto a través de una subcadena del valor del año DDL.

¿Existe algún método para convertir un año de cuatro dígitos en un año de dos dígitos?No veo nada en el DateTime objeto.¿O debería seguir procesándolo como estoy?

¿Fue útil?

Solución

Si está creando un objeto DateTime usando las fechas de vencimiento (mes/año), puede usar ToString() en su variable DateTime de esta manera:

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

Editar:Sin embargo, tenga cuidado con sus fechas si utiliza el objeto DateTime durante la validación.Si alguien selecciona 05/2008 como fecha de vencimiento de su tarjeta, ésta vencerá a finales de mayo, no el primero.

Otros consejos

1ra solución (más rápido):

yourDateTime.Year % 100

2da solución (más elegante en mi opinión):

yourDateTime.ToString("yy")

La respuesta ya está dada.Pero aquí quiero agregar algo.Alguien dijo que no funcionó.

Puede ser que estés usando

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

por eso no funciona.Yo también cometí el mismo error.

Cámbielo a

DateTime.Now.ToString("yy");

Esto debería funcionar para ti:

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

No creo que haya ningún elemento especial integrado en .NET.

Actualizar:Falta alguna validación que tal vez deberías hacer.Validar la longitud de las variables ingresadas, etc.

En este punto, la forma más sencilla es simplemente truncar los dos últimos dígitos del año.Para las tarjetas de crédito, tener una fecha en el pasado es innecesario, por lo que el año 2000 no tiene significado.Lo mismo se aplica si de alguna manera su código sigue ejecutándose después de más de 90 años.

Yo iría más allá y diría que en lugar de usar una lista desplegable, permita que el usuario escriba el año por sí mismo.Esta es una forma común de hacerlo y la mayoría de los usuarios pueden manejarla.

Utilice el objeto DateTime ToString con una cadena de formato personalizado como myDate.ToString("MM/dd/yy"), por ejemplo.

He visto algunos sistemas decidir que el límite es 75;75+ es 19xx y menos es 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)

Funciona para el año en curso.Cambiar DateTime.Now.Year para que funcione también un año más.

¿Por qué no hacer que el menú desplegable original de la página tenga solo un valor de 2 dígitos?Las tarjetas de crédito solo cubren un pequeño lapso cuando se analiza el año, especialmente si el proveedor de CC ya solo acepta 2 dígitos.

Aquí hay un enlace a un artículo de 4Guys sobre cómo formatear fechas y horas usando el método ToString() pasando una cadena de formato personalizado.

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

En caso de que desaparezca, aquí está uno de los ejemplos.

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

Dado que su enlace está roto, aquí hay un enlace a la clase DateTimeFormatInfo que hace posibles esas opciones de formato.

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

Probablemente sea un poco más coherente hacer algo así en lugar de utilizar una subcadena, pero quién sabe.

Esta es una publicación antigua, pero pensé en dar un ejemplo usando un ExtensionMethod (desde C# 3.0), ya que esto ocultará la implementación y permitirá su uso en todas partes del proyecto o recrear el código una y otra vez o necesitar estar al tanto de alguna clase de utilidad.

Los métodos de extensión le permiten "agregar" métodos a los tipos existentes sin crear un nuevo tipo derivado, recompensar o modificar el tipo original.Los métodos de extensión son un tipo especial de método estático, pero se llaman como si fueran métodos de instancia en el tipo extendido.Para el código del cliente escrito en C# y Visual Basic, no existe una diferencia aparente entre llamar a un método de extensión y los métodos que realmente se definen en un tipo.

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

Luego puede llamar a este método en cualquier lugar donde use un DateTime objeto, por ejemplo...

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

La respuesta es bastante simple:

FechaHora Hoy = FechaHora.Hoy;string zeroBased = Today.ToString("aa-MM-dd");

Esto parece funcionar bien para mí.yourDateTime.ToString().Substring(2);

Incluso si existiera una forma incorporada, no la validaría como mayor que la actual y diferiría muy poco de una llamada de subcadena.Yo no me preocuparía por eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top