我的信用卡处理器要求我从信用卡到期日期发送两位数的年份。这是我目前的处理方式:
- 我
DropDownList
在页面上放了一个 4 位数的年份。 - 我在
DateTime
字段中验证过期日期,以确保传递给 CC 处理器的过期日期没有过期。 - 我将两位数的年份发送到 CC 处理器(根据需要)。我通过年份 DDL 中的值的子字符串来执行此操作。
有没有一种方法可以将四位数的年份转换为两位数的年份。我没有在DateTime
物体上看到任何东西。还是我应该继续按原样处理它?
我的信用卡处理器要求我从信用卡到期日期发送两位数的年份。这是我目前的处理方式:
DropDownList
在页面上放了一个 4 位数的年份。DateTime
字段中验证过期日期,以确保传递给 CC 处理器的过期日期没有过期。有没有一种方法可以将四位数的年份转换为两位数的年份。我没有在DateTime
物体上看到任何东西。还是我应该继续按原样处理它?
如果您使用到期日期(月/年)创建 DateTime 对象,则可以在 DateTime 变量上使用 ToString(),如下所示:
DateTime expirationDate = new DateTime(2008, 1, 31); // random date
string lastTwoDigitsOfYear = expirationDate.ToString("yy");
编辑:如果您在验证期间使用 DateTime 对象,请注意您的日期。如果有人选择 05/2008 作为他们卡的到期日期,它会在 5 月底到期,而不是在第一天到期。
第一种解决方案(最快):
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 中没有任何特殊的内置内容。
更新:它缺少一些您可能应该做的验证。验证输入变量的长度,等等。
例如,使用带有自定义格式字符串的 DateTime 对象 ToString,例如 myDate.ToString("MM/dd/yy")。
//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
从 c# 6.0 开始,您可以在任何处理 c#(例如 MVC Razor 页面)的字符串插值中使用内置复合格式。
DateTime date = DateTime.Now;
string myTwoDigitYear = $"{date:yy};
无需扩展。您可以在大括号内的任何有效 DateTime 对象之后的冒号后使用大多数标准日期和时间格式字符串,以使用内置的复合格式。
此时,最简单的方法就是截断年份的最后两位数。对于信用卡,过去的日期是不必要的,所以 Y2K 没有意义。如果您的代码以某种方式仍在运行 90 多年,这同样适用。
我会进一步说,不要使用下拉列表,而是让用户自己输入年份。这是一种常见的方法,大多数用户都可以处理。
我见过一些系统决定截止值是 75;75+是19xx,低于20xx。
DateTime.Now.Year - (DateTime.Now.Year / 100 * 100)
本年度工作。更改DateTime.Now.Year
以使其还能再工作一年。
答案很简单:
DateTime Today = DateTime.Today;
string zeroBased = Today.ToString("yy-MM-dd");
为什么页面上的原始下拉列表不只是一个 2 位数的值?在查看年份时,信用卡只覆盖很小的跨度,特别是如果 CC 供应商已经只接受 2 位数。
这是 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();
这对我来说似乎没问题。
yourDateTime.ToString().Substring(2);
即使存在内置方式,它也不会验证它比今天更大,并且它与子字符串调用几乎没有什么不同。我不会担心的。