69

我的信用卡处理器要求我从信用卡到期日期发送两位数的年份。这是我目前的处理方式:

  1. DropDownList在页面上放了一个 4 位数的年份。
  2. 我在DateTime字段中验证过期日期,以确保传递给 CC 处理器的过期日期没有过期。
  3. 我将两位数的年份发送到 CC 处理器(根据需要)。我通过年份 DDL 中的值的子字符串来执行此操作。

有没有一种方法可以将四位数的年份转换为两位数的年份。我没有在DateTime物体上看到任何东西。还是我应该继续按原样处理它?

4

16 回答 16

117

如果您使用到期日期(月/年)创建 DateTime 对象,则可以在 DateTime 变量上使用 ToString(),如下所示:

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

编辑:如果您在验证期间使用 DateTime 对象,请注意您的日期。如果有人选择 05/2008 作为他们卡的到期日期,它会在 5 月底到期,而不是在第一天到期。

于 2008-09-22T15:17:53.343 回答
51

第一种解决方案(最快):

yourDateTime.Year % 100

第二个解决方案(我认为更优雅):

yourDateTime.ToString("yy")
于 2014-05-21T12:16:25.777 回答
16

答案已经给出。但在这里我想补充一点。有人说它不起作用。

可能是你正在使用

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

这就是为什么它不起作用。我也犯了同样的错误。

将其更改为

DateTime.Now.ToString("yy");

于 2017-06-04T18:12:33.047 回答
5

这应该适合你:

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 中没有任何特殊的内置内容。

更新:它缺少一些您可能应该做的验证。验证输入变量的长度,等等。

于 2008-09-22T15:22:47.497 回答
2

例如,使用带有自定义格式字符串的 DateTime 对象 ToString,例如 myDate.ToString("MM/dd/yy")。

于 2008-09-22T15:17:09.383 回答
2
//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
于 2011-04-16T09:52:58.213 回答
2

从 c# 6.0 开始,您可以在任何处理 c#(例如 MVC Razor 页面)的字符串插值中使用内置复合格式。

DateTime date = DateTime.Now;

string myTwoDigitYear = $"{date:yy};

无需扩展。您可以在大括号内的任何有效 DateTime 对象之后的冒号后使用大多数标准日期和时间格式字符串,以使用内置的复合格式

于 2021-06-07T15:35:50.437 回答
1

此时,最简单的方法就是截断年份的最后两位数。对于信用卡,过去的日期是不必要的,所以 Y2K 没有意义。如果您的代码以某种方式仍在运行 90 多年,这同样适用。

我会进一步说,不要使用下拉列表,而是让用户自己输入年份。这是一种常见的方法,大多数用户都可以处理。

于 2008-09-22T15:15:28.607 回答
1

我见过一些系统决定截止值是 75;75+是19xx,低于20xx。

于 2008-09-22T15:18:39.707 回答
1
DateTime.Now.Year - (DateTime.Now.Year / 100 * 100)

本年度工作。更改DateTime.Now.Year以使其还能再工作一年。

于 2011-06-04T07:09:23.290 回答
1

答案很简单:

DateTime Today = DateTime.Today;
string zeroBased = Today.ToString("yy-MM-dd");
于 2016-10-25T08:22:00.603 回答
0

为什么页面上的原始下拉列表不只是一个 2 位数的值?在查看年份时,信用卡只覆盖很小的跨度,特别是如果 CC 供应商已经只接受 2 位数。

于 2008-09-22T15:15:38.823 回答
0

这是 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

做这样的事情而不是使用子字符串可能更一致,但谁知道呢。

于 2008-09-22T15:24:55.463 回答
0

这是一篇旧文章,但我想我会给出一个使用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();
于 2015-06-19T09:54:54.757 回答
0

这对我来说似乎没问题。 yourDateTime.ToString().Substring(2);

于 2018-11-09T03:08:23.883 回答
-1

即使存在内置方式,它也不会验证它比今天更大,并且它与子字符串调用几乎没有什么不同。我不会担心的。

于 2008-09-22T15:15:58.277 回答