web-dev-qa-db-ja.com

C#で年を4桁から2桁に変換し、元に戻す

クレジットカードの処理者は、クレジットカードの有効期限から2桁の年を送信する必要があります。現在処理中の方法は次のとおりです。

  1. 4桁の年のDropDownListをページに配置しました。
  2. DateTimeフィールドの有効期限を検証して、CCプロセッサに渡される有効期限が期限切れになっていないことを確認します。
  3. 2桁の年をCCプロセッサに送信します(必要に応じて)。これは、DDL年の値のサブストリングを介して行います。

4桁の年を2桁の年に変換する方法はありますか? DateTimeオブジェクトには何も表示されません。それとも、そのまま処理を続けるべきですか?

52
Mike Wills

有効期限(月/年)を使用してDateTimeオブジェクトを作成する場合、DateTime変数でToString()を次のように使用できます。

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

編集:検証中にDateTimeオブジェクトを使用する場合は、日付に注意してください。誰かがカードの有効期限として05/2008を選択した場合、最初ではなく5月末に有効期限が切れます。

90
brock.holum

最初の解決策(最速):

yourDateTime.Year % 100

第2の解決策(私の意見ではよりエレガント):

yourDateTime.ToString("yy")
31
Zbigniew Wiadro

答えはすでに与えられています。しかし、ここで何かを追加したいと思います。何人かはそれが機能しなかったと言った。

使用している可能性があります

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

それが機能しない理由です。私も同じ間違いを犯しました。

に変更する

DateTime.Now.ToString("yy");

6
Sadid Khan

これはあなたのために働くはずです:

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には特別な組み込み機能はないと思います。

更新:おそらく行うべき検証が欠落しています。入力された変数の長さなどを検証します。

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)

現在の年で動作します。変化する DateTime.Now.Yearさらに1年間機能させる。

1
Phiplex

この時点で、最も簡単な方法は、年の下2桁を切り捨てることです。クレジットカードの場合、過去の日付を持つ必要はないため、Y2Kには意味がありません。何らかの方法でコードが90年以上実行されている場合も同様です。

さらに進んで、ドロップダウンリストを使用する代わりに、ユーザー自身が年を入力できるようにします。これは一般的な方法であり、ほとんどのユーザーが処理できます。

1
NotMe

たとえば、DateDateオブジェクトToStringをmyDate.ToString( "MM/dd/yy")などのカスタム形式の文字列と共に使用します。

1
ckramer

一部のシステムでは、カットオフが75であると判断されています。 75+は19xxで、以下は20xxです。

1
spoulson

カスタム形式の文字列を渡すことにより、ToString()メソッドを使用して日付と時刻をフォーマットする方法に関する4Guysの記事へのリンクを次に示します。

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

おそらく、部分文字列を使用するのではなく、そのようなことをする方が少し一貫していますが、誰が知っていますか。

0
Harv

これは古い投稿ですが、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();
0
christiandev

答えは非常に簡単です。

DateTime Today = DateTime.Today; string zeroBased = Today.ToString( "yy-MM-dd");

0

ページ上の元のドロップダウンを2桁の値のみにしないのはなぜですか?クレジットカードは、CCベンダーが既に2桁しか入力していない場合は特に、年を見るときに狭い範囲しかカバーしません。

0
Andrew Jahn

これは私にとってはうまくいくようです。 yourDateTime.ToString().Substring(2);

0
John