【问题标题】:Converting a year from 4 digit to 2 digit and back again in C#在 C# 中将年份从 4 位转换为 2 位并再次返回
【发布时间】:2010-09-12 00:55:43
【问题描述】:

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

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

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

【问题讨论】:

  • 我很高兴没有内置方法,因为我可以看到它一直因为错误的原因被使用...重新介绍 Y2K 有人吗? =)

标签: c# datetime 2-digit-year


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      即使存在内置方式,它也不会验证它是否比今天更大,并且它与子字符串调用的差异很小。我不会担心的。

      【讨论】:

        【解决方案4】:

        将 DateTime 对象 ToString 与自定义格式字符串一起使用,例如 myDate.ToString("MM/dd/yy")。

        【讨论】:

          【解决方案5】:

          如果您使用到期日期(月/年)创建 DateTime 对象,您可以像这样在 DateTime 变量上使用 ToString():

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

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

          【讨论】:

          • 是的,我检查大于或等于是否被认为是有效的。
          • 我用% 100作为最后两位数,检查this
          • 不知道这是怎么得到这么多赞成票并被标记为答案的......不起作用
          • 代替 date.ToString("yy") 你也可以使用语法糖,即:date:yy
          【解决方案6】:

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

          【讨论】:

          • 承包商会在 2074 年爱上你
          【解决方案7】:

          这应该适合你:

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

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

          【讨论】:

            【解决方案8】:

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

            这样做可能比使用子字符串更一致,但谁知道呢。

            【讨论】:

              【解决方案9】:
              //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
              

              【讨论】:

                【解决方案10】:
                DateTime.Now.Year - (DateTime.Now.Year / 100 * 100)
                

                适用于当年。更改DateTime.Now.Year 使其还能再工作一年。

                【讨论】:

                • 听说过模运算符%
                【解决方案11】:

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

                yourDateTime.Year % 100
                

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

                yourDateTime.ToString("yy")
                

                【讨论】:

                • 当您只有整数年开始时,您的第一个解决方案很有用,而不是 DateTime。
                • @xr280xr,或者如果您想要一个整数而不是字符串作为结果。
                • @xr280xr 第一个解决方案yourDateTime.Year 已经返回一个整数。不是DateTime
                • @0014 我想我的意思是如果你只处理 int 年。例如。如果您有 int yourYear=2018; 而不是 yourDate,那么它适用于 yourYear % 100 - 无需创建 DateTime 实例。
                【解决方案12】:

                这是一篇旧帖子,但我想我会使用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();
                

                【讨论】:

                  【解决方案13】:

                  答案很简单:

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

                  【讨论】:

                  • 你也可以写成一行string zeroBased = DateTime.Today.ToString("yy-MM-dd");
                  【解决方案14】:

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

                  可能你正在使用

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

                  这就是它不起作用的原因。我也犯了同样的错误。

                  改成

                  DateTime.Now.ToString("yy");

                  【讨论】:

                  • 谢谢 - 我正要犯这个错误?
                  • 很高兴听到。如果对你有帮助,别忘了点个赞哦:)
                  【解决方案15】:

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

                  【讨论】:

                    【解决方案16】:

                    从 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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-05-26
                      • 2021-12-14
                      • 2019-06-18
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-03-03
                      • 2011-01-02
                      相关资源
                      最近更新 更多