it-swarm-eu.dev

Převod roku ze 4 číslic na 2 číslice a zpět v jazyce C #

Procesor mé kreditní karty vyžaduje, abych odeslal dvoumístný rok od data vypršení platnosti kreditní karty. Zde je postup zpracování:

  1. Na stránku jsem umístil DropDownList čtyřmístného roku.
  2. Ověřím datum vypršení platnosti v poli DateTime, abyste se ujistili, že datum vypršení platnosti předané procesoru CC neuplynulo.
  3. Procesoru CC (podle potřeby) odesílám dvoumístný rok. Dělám to přes podřetězec hodnoty z roku DDL.

Existuje tam metoda, která převede čtyřmístný rok na dvoumístný rok. V objektu DateTime nevidím nic. Nebo bych to měl zpracovat stejně jako já?

47
Mike Wills

Vytváříte-li objekt DateTime pomocí data vypršení platnosti (měsíc/rok), můžete použít proměnnou ToString () v proměnné DateTime takto:

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

Úpravy: Buďte opatrní s daty, pokud používáte objekt DateTime během ověřování. Pokud si někdo vybere 05/2008 jako datum vypršení platnosti své karty, vyprší na konci května, nikoli na prvním místě.

84
brock.holum

1. řešení (nejrychlejší):

yourDateTime.Year % 100

2. řešení (podle mého názoru elegantnější):

yourDateTime.ToString("yy")
26
Zbigniew Wiadro

Odpověď je již uvedena. Ale tady chci něco přidat. Někdo řekl, že to nefunguje. 

Možná používáte 

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

proto nefunguje. Stejnou chybu jsem také udělal.

Změňte to na 

DateTime.Now.ToString("yy");

7
Sadid Khan

To by mělo fungovat pro vás:

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

Nemyslím si, že v .NET existují nějaké speciální vestavěné věci.

Update : Chybí nějaká validace, kterou byste možná měli udělat. Ověřte délku zadaných proměnných a tak dále.

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)

Pracuje pro aktuální rok. Změňte DateTime.Now.Year tak, aby fungovalo i na další rok. 

1
Phiplex

V tomto bodě je nejjednodušším způsobem zkrátit poslední dvě číslice roku. Pro kreditní karty, které mají datum v minulosti, je zbytečné, takže Y2K nemá žádný význam. Totéž platí, pokud váš kód stále běží v 90+ letech.

Chtěl bych jít dál a říct, že namísto použití rozevíracího seznamu nechte uživatele zadat v samotném roce. To je běžný způsob, jak to udělat a většina uživatelů to zvládne.

1
NotMe

Použijte objekt DateTime ToString s řetězcem vlastního formátu, například myDate.ToString ("MM/dd/yy").

1
ckramer

Viděl jsem, že některé systémy se rozhodly, že cutoff je 75; 75+ je 19xx a níže je 20xx.

1
spoulson

Zde je odkaz na článek 4Guys o tom, jak můžete formátovat data a časy pomocí metody ToString () předáním v řetězci vlastního formátu.

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

Jen pro případ, že by to šlo, je jeden z příkladů.

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

Vzhledem k tomu, že je tento odkaz přerušen, je zde odkaz na třídu DateTimeFormatInfo, která umožňuje tyto možnosti formátování.

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

Je to asi o něco více konzistentní, než aby něco takového používal, než aby používal podřetězce, ale kdo ví.

0
Harv

Toto je starý příspěvek, ale myslel jsem, že bych dal příklad pomocí ExtensionMethod (protože C # 3.0), protože to skryje implementaci a umožní použití všude v projektu místo toho, nebo znovu a znovu vytvořit kód, nebo je třeba být vědom si nějaké užitné třídy.

Metody rozšíření umožňují "přidat" metody existujícím typům Bez vytvoření nového odvozeného typu, rekompilace nebo jinak Úpravy původního typu. Metody rozšíření jsou speciálním druhem statické metody , Ale jsou označovány jako metody instance na rozšířeném typu . Pro klientský kód napsaný v jazyce C # a Visual Basic Neexistuje žádný zjevný rozdíl mezi voláním metody rozšíření A metodami, které jsou ve skutečnosti definovány v typu.

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

Tuto metodu pak můžete volat kdekoli, kde používáte objekt DateTime, například ...

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

Odpověď je velmi jednoduchá:

DateTime Today = DateTime.Today; Řetězec zeroBased = Today.ToString ("yy-MM-dd");

0
Iliass Nassibane

Proč nechcete, aby původní rozbalovací stránka byla pouze dvoumístná? Kreditní karty pokrývají pouze malé rozpětí, když se díváte na rok, zejména pokud dodavatel CC trvá pouze 2 číslice.

0
Andrew Jahn

Zdá se, že to pro mě funguje dobře. yourDateTime.ToString().Substring(2);

0
John