C# 用C语言将一年从4位数转换为2位数,然后再转换回来#
我的信用卡处理程序要求我从信用卡到期日起发送两位数的年份。以下是我目前的处理方式:C# 用C语言将一年从4位数转换为2位数,然后再转换回来#,c#,datetime,2-digit-year,C#,Datetime,2 Digit Year,我的信用卡处理程序要求我从信用卡到期日起发送两位数的年份。以下是我目前的处理方式: 我在页面上放置了一个4位数年份的DropDownList 我在DateTime字段中验证过期日期,以确保传递给CC处理器的过期日期未过期 我向CC处理器发送两位数的年份(根据需要)。我通过DDL年值的子字符串来实现这一点 有没有办法把四位数的年份转换成两位数的年份。我在DateTime对象上没有看到任何内容。或者我应该继续像现在这样处理它吗?在这一点上,最简单的方法就是截断一年中的最后两位数。对于信用卡来说,没有
DropDownList
DateTime
字段中验证过期日期,以确保传递给CC处理器的过期日期未过期有没有办法把四位数的年份转换成两位数的年份。我在
DateTime
对象上没有看到任何内容。或者我应该继续像现在这样处理它吗?在这一点上,最简单的方法就是截断一年中的最后两位数。对于信用卡来说,没有必要将日期定在过去,因此Y2K没有任何意义。如果你的代码在90多年后仍在运行,同样的情况也会发生
我想进一步说,与其使用下拉列表,不如让用户自己输入年份。这是一种常见的方法,大多数用户都可以处理。为什么页面上的原始下拉列表不能只有两位数?查看年份时,信用卡的覆盖范围很小,特别是如果CC供应商只接受了2位数字。即使存在内置方式,它也不会验证为比今天更大,并且与子字符串调用差别很小。我不担心这个问题。使用DateTime对象ToString和自定义格式字符串,例如myDate.ToString(“MM/dd/yy”)。如果要使用过期日期(月/年)创建DateTime对象,可以对DateTime变量使用ToString(),如下所示:
DateTime expirationDate = new DateTime(2008, 1, 31); // random date
string lastTwoDigitsOfYear = expirationDate.ToString("yy");
编辑:如果在验证过程中使用DateTime对象,请注意日期。如果有人选择2008年5月5日作为信用卡的到期日,它将在5月底到期,而不是在第一天。我看到一些系统决定截止日期为75;75+等于19xx,低于20xx。这应该适合您:
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中没有任何特殊的内置内容
更新:它缺少一些您可能应该执行的验证。验证输入变量的长度,依此类推。这里有一个4Guys文章的链接,介绍如何通过传入自定义格式字符串,使用ToString()方法格式化日期和时间 以防万一,这里就是一个例子
'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类的链接,该类使这些格式选项成为可能
这样做可能比使用子字符串更加一致,但谁知道呢
//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
,使其在下一年也能正常工作 第一个解决方案(最快):
第二种解决方案(我认为更优雅):
这是一篇老文章,但我想我应该给出一个使用
扩展方法的例子(从C#3.0开始),因为这将隐藏实现并允许在项目中的任何地方使用,或者一遍又一遍地重新创建代码,或者需要知道一些实用程序类
扩展方法使您能够向现有类型“添加”方法
无需创建新的派生类型、重新编译或其他方式
修改原始类型。可拓方法是一种特殊的方法
静态方法,但调用它们时就好像它们是上的实例方法一样
扩展类型。对于用C#和Visual Basic编写的客户端代码,
调用扩展方法之间没有明显的区别
以及在类型中实际定义的方法
然后,您可以在使用DateTime
对象的任何位置调用此方法,例如
var dateTime = new DateTime(2015, 06, 19);
var year = cob.ToYearLastTwoDigit();
答案很简单:
DateTime Today=DateTime.Today;
字符串zeroBased=Today.ToString(“yy-MM-dd”);
答案已经给出。但这里我想补充一点。
有人告诉我它不起作用
可能是您正在使用的
DateTime.Now.Year.ToString(“yy”)代码>
这就是它不起作用的原因。我也犯了同样的错误
换成
DateTime.Now.ToString(“yy”)代码>
这对我来说似乎没问题。
yourDateTime.ToString()子字符串(2)代码>从c#6.0开始,您可以在处理c#的任何内容上使用内置的复合格式,如MVC Razor页面
DateTime date = DateTime.Now;
string myTwoDigitYear = $"{date:yy};
不需要扩展。您可以使用大括号内任何有效日期时间对象后的冒号来使用内置对象。是的,我检查大于或等于是否被视为有效。我使用%100
作为最后两位数字,检查不知道这是如何获得如此多的向上投票并标记为答案的…不适用于日期。ToString(“yy”)您还可以使用语法糖,即:date:yy是否听说过模运算符%
?我很高兴没有内置方法,因为我可以看到它一直被用于错误的原因。。。重新介绍Y2K(有人吗?=)承包商会在2074年爱上您的。当您只有一个整数年开始,而不是日期时间时,您的第一个解决方案非常有用。@xr280xr,或者如果您希望结果是整数而不是字符串。@xr280xr第一个解决方案yourDateTime.year
已经返回了一个整数。不是一个DateTime
@0014我想我的意思是如果你只处理int年。例如,如果您有int yourYear=2018
而不是yourDate
,然后它适用于yourYear%100
-无需创建DateTime实例。您也可以将其写入一行string zeroBased=DateTime.Today.ToString(“yy-MM-dd”)代码>谢谢-很高兴听到这个消息,我就要犯这个错误了。如果这对你有帮助,别忘了投赞成票:)很棒的建议谢谢!
yourDateTime.ToString("yy")
public static class DateTimeExtensions
{
public static int ToYearLastTwoDigit(this DateTime date)
{
var temp = date.ToString("yy");
return int.Parse(temp);
}
}
var dateTime = new DateTime(2015, 06, 19);
var year = cob.ToYearLastTwoDigit();
DateTime date = DateTime.Now;
string myTwoDigitYear = $"{date:yy};