将一年从4位数转换为2位数再转换回C#

时间:2008-09-22 15:12:17

标签: c# datetime 2-digit-year

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

  1. 我在页面上放了一个4位数的DropDownList
  2. 我在DateTime字段中验证过期日期,以确保传递给CC处理器的过期日期未过期。
  3. 我向CC处理器发送了两位数的年份(根据需要)。我是通过年DDL值的子字符串来完成的。
  4. 是否有方法将四位数年份转换为两位数年份。我在DateTime对象上没有看到任何内容。或者我应该像我一样继续处理它?<​​/ p>

16 个答案:

答案 0 :(得分:84)

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

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

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

答案 1 :(得分:29)

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

yourDateTime.Year % 100

第二个解决方案(在我看来更优雅):

yourDateTime.ToString("yy")

答案 2 :(得分:6)

答案已经给出。但在这里我想补充一些东西。 有人告诉它没用。

可能是你正在使用

  

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

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

将其更改为

  

DateTime.Now.ToString("yy");

答案 3 :(得分: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中没有任何特殊的内置功能。<​​/ p>

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

使用DateTime对象ToString和自定义格式字符串,例如myDate.ToString(“MM / dd / yy”)。

答案 6 :(得分:1)

我看到一些系统认为截止值为75; 75+是19xx,低于20xx。

答案 7 :(得分:1)

//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

答案 8 :(得分:1)

DateTime.Now.Year - (DateTime.Now.Year / 100 * 100)

适用于本年度。更改DateTime.Now.Year以使其也适用于另一年。

答案 9 :(得分:0)

为什么不将页面上的原始下拉列表仅为2位数值?信用卡在查看年份时仅覆盖一小段时间,特别是如果CC供应商仅占用2位数。

答案 10 :(得分:0)

这是一篇关于如何使用ToString()方法通过传入自定义格式字符串来格式化日期和时间的4Guys文章的链接。

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

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

答案 11 :(得分: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();

答案 12 :(得分:0)

答案很简单:

DateTime Today = DateTime.Today; string zeroBased = Today.ToString(“yy-MM-dd”);

答案 13 :(得分:0)

这对我来说似乎还可以。 yourDateTime.ToString().Substring(2);

答案 14 :(得分:0)

从 c# 6.0 开始,您可以在处理 c# 的任何内容(例如 MVC Razor 页面)上使用 string interpolation 中的内置复合格式。

DateTime date = DateTime.Now;

string myTwoDigitYear = $"{date:yy};

无需扩展。您可以在大括号内的任何有效 DateTime 对象之后的冒号后使用大部分 standard date and time format strings 来使用内置的 composite formatting

答案 15 :(得分:-1)

即使存在内置方式,它也不会将其验证为比今天更大,并且它与子串调用的差别很小。我不担心。