交换 4 位日期字符串中的月份和年份

Swapping the month and the year in a 4 digit date string

基本上,我接受过期日期。比方说 12/24。我提交的 API 非常具体,没有斜线,年份必须在前面。

删除斜杠很容易:

var dt = Convert.ToString(payment.ExpirationDate.Replace("/", string.Empty));

所以,现在我有一个字符串中的 4 位数字,我想我也可以 Convert.ToInt32 并有一个整数。

但无论哪种方式,我都不确定如何拆分和交换。对于字符串,它需要一个字符,而不是数字。

删除斜杠后

public static string ReverseString(this string s)
{
    char[] arr = s.ToCharArray();
    Array.Reverse(arr);
    return new string(arr);
}

示例:

var dt = Convert.ToString(payment.ExpirationDate.Replace("/", string.Empty));
var dt2 = dt.ReverseString();

使用正则表达式从两个单独变量中的输入字符串中提取年份 + 月份。然后你就可以reorder/format他们想干什么就干什么。

using System;
using System.Text.RegularExpressions;
                    
public class Program
{
    public static void Main()
    {
        var regexTest = new Regex(@"(?<month>\d{2})/(?<year>\d{2})");
        var input = "12/24";
        var match = regexTest.Match(input);
        if(match.Success) {
            var monthValue = match.Groups["month"];
            var yearValue = match.Groups["year"];
            Console.WriteLine($"{yearValue} - {monthValue}");
        }
    }
}

您可以使用 ParseExact:

将原始字符串转换为 DateTime 对象
DateTime.ParseExact(payment.ExpirationDate, "MM/yy", null)

这样,将 DateTime 对象格式化为“yyMM”就非常容易了:

datetime.ToString("yyMM")

使用您提供的字符串的完整示例:

Console.WriteLine(DateTime.ParseExact("12/24", "MM/yy", null).ToString("yyMM"));

输出为:

2412

由于您要处理日期,因此您可能应该使用 DateTime。这允许您验证日期并生成您想要的任何其他格式。

像这样的东西应该可以完成工作:

string input = "12/24";
DateTime date = DateTime.ParseExact(input, "MM/yy", CultureInfo.CurrentCulture);
string output = date.ToString("yyMM");

如果您确定日期格式正确,请使用以上方法。如果没有,您可以使用以下方式验证它:

bool isValid = DateTime.TryParseExact(input, "MM/yy", CultureInfo.CurrentCulture, 
                                      DateTimeStyles.None, out DateTime date);
if (isValid)
{
    string output = date.ToString("yyMM");
    //...
}
else { /* Do something about it */ }

为避免将世纪误认为 50 年或以上 (as addressed in the comments),您可以创建自定义 CultureInfo 并更改 TwoDigitYearMax 属性:

CultureInfo myCultureInfo = new CultureInfo(CultureInfo.CurrentCulture.LCID);
myCultureInfo.Calendar.TwoDigitYearMax = 2099;

然后,您将 myCultureInfo 而不是 CultureInfo.CurrentCulture 传递给 ParseExact()TryParseExact()