تحويل سنة من 4 أرقام إلى رقمين والعودة مرة أخرى في C#

StackOverflow https://stackoverflow.com/questions/115399

  •  02-07-2019
  •  | 
  •  

سؤال

يتطلب معالج بطاقتي الائتمانية إرسال سنة مكونة من رقمين من تاريخ انتهاء صلاحية بطاقة الائتمان.إليك الطريقة التي أعالج بها حاليًا:

  1. أضع أ DropDownList للسنة المكونة من 4 أرقام على الصفحة.
  2. أقوم بالتحقق من صحة تاريخ انتهاء الصلاحية في DateTime الحقل للتأكد من عدم انتهاء صلاحية تاريخ انتهاء الصلاحية الذي تم تمريره إلى معالج CC.
  3. أرسل سنة مكونة من رقمين إلى معالج CC (كما هو مطلوب).أفعل ذلك عبر سلسلة فرعية من القيمة من DDL للسنة.

هل هناك طريقة لتحويل السنة المكونة من أربعة أرقام إلى سنة مكونة من رقمين.أنا لا أرى أي شيء على DateTime هدف.أم يجب أن أستمر في معالجتها كما أنا؟

هل كانت مفيدة؟

المحلول

إذا كنت تقوم بإنشاء كائن DateTime باستخدام تواريخ انتهاء الصلاحية (شهر/سنة)، فيمكنك استخدام ToString() في متغير DateTime الخاص بك كما يلي:

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

يحرر:كن حذرًا بشأن التواريخ الخاصة بك إذا كنت تستخدم كائن DateTime أثناء التحقق من الصحة.إذا قام شخص ما باختيار 05/2008 كتاريخ انتهاء صلاحية بطاقته، فستنتهي صلاحيتها في نهاية شهر مايو، وليس في الأول منه.

نصائح أخرى

الحل الأول (الأسرع):

yourDateTime.Year % 100

الحل الثاني (أكثر أناقة في رأيي):

yourDateTime.ToString("yy")

تم تقديم الجواب بالفعل.ولكن هنا أريد أن أضيف شيئا.وقال شخص ما أنه لم ينجح.

ربما كنت تستخدم

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

وهذا هو السبب في أنها لا تعمل.أنا أيضا ارتكبت نفس الخطأ.

تغييره إلى

DateTime.Now.ToString("yy");

هذا يجب أن تعمل من أجلك:

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.

تحديث:إنه يفتقد بعض التحقق الذي ربما ينبغي عليك القيام به.التحقق من صحة طول المتغيرات المدخلة، وما إلى ذلك.

في هذه المرحلة، أبسط طريقة هي اقتطاع آخر رقمين من السنة.بالنسبة لبطاقات الائتمان، فإن وجود تاريخ في الماضي ليس ضروريًا، لذا فإن عام 2000 ليس له أي معنى.وينطبق الشيء نفسه على ما إذا كان الكود الخاص بك لا يزال قيد التشغيل بطريقة ما لأكثر من 90 عامًا.

سأذهب إلى أبعد من ذلك وأقول إنه بدلاً من استخدام القائمة المنسدلة، اسمح للمستخدم بكتابة السنة بنفسه.هذه طريقة شائعة للقيام بذلك ويمكن لمعظم المستخدمين التعامل معها.

استخدم كائن DateTime ToString مع سلسلة تنسيق مخصصة مثل myDate.ToString("MM/dd/yy") على سبيل المثال.

لقد رأيت بعض الأنظمة تقرر أن الحد الأقصى هو 75؛75+ هو 19xx وأقل من 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)

يعمل للعام الحالي.يتغير DateTime.Now.Year لجعله يعمل أيضا لمدة عام آخر.

لماذا لا تكون القائمة المنسدلة الأصلية في الصفحة مكونة من رقمين فقط؟لا تغطي بطاقات الائتمان سوى فترة صغيرة عند النظر إلى السنة، خاصةً إذا كان بائع CC يأخذ رقمين فقط بالفعل.

فيما يلي رابط لمقالة 4Guys حول كيفية تنسيق التواريخ والأوقات باستخدام طريقة ToString() عن طريق تمرير سلسلة تنسيق مخصصة.

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

ربما يكون القيام بشيء كهذا أكثر اتساقًا قليلاً بدلاً من استخدام سلسلة فرعية، ولكن من يدري.

هذا منشور قديم، لكنني أعتقد أنني سأعطي مثالاً باستخدام 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();

الجواب بسيط جدا:

DateTime اليوم = DateTime.Today؛string ZeroBased = Today.ToString("yy-MM-dd");

يبدو أن هذا يعمل بشكل جيد بالنسبة لي.yourDateTime.ToString().Substring(2);

حتى لو كانت هناك طريقة مدمجة، فلن يتم التحقق من صحتها على أنها أكبر مما هي عليه اليوم وستختلف قليلاً جدًا عن استدعاء السلسلة الفرعية.لن أقلق بشأن ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top