在 C# 中将年份从 4 位数转换为 2 位数并再转换回来
-
02-07-2019 - |
题
我的信用卡处理机构要求我发送自信用卡到期日起的两位数年份。以下是我目前的处理方式:
- 我放了一个
DropDownList
页面上的 4 位数年份。 - 我验证过期日期
DateTime
字段以确保传递给 CC 处理器的到期日期尚未到期。 - 我向 CC 处理器发送两位数的年份(根据需要)。我通过年份 DDL 中的值的子字符串来执行此操作。
有没有一种方法可以将四位数年份转换为两位数年份。我没有看到任何内容 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 中有任何特殊的内置东西。
更新: :它缺少一些您可能应该做的验证。验证输入变量的长度等。
此时,最简单的方法就是截断年份的最后两位数字。对于信用卡来说,过去的日期是不必要的,因此 Y2K 没有任何意义。如果您的代码不知何故仍在运行 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
让它再工作一年。
为什么页面上的原始下拉列表不只是 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);
}
}
然后您可以在任何使用 a 的地方调用此方法 DateTime
对象,例如...
var dateTime = new DateTime(2015, 06, 19);
var year = cob.ToYearLastTwoDigit();
答案很简单:
今天的日期时间 = DateTime.Today;字符串zeroBased = Today.ToString("yy-MM-dd");
这似乎对我来说没问题。yourDateTime.ToString().Substring(2);
即使存在内置方法,它也不会验证它是否比现在更好,并且它与子字符串调用几乎没有什么不同。我不会担心这个。