将指定字符串拆分为日期

本文关键字:日期 拆分 字符串 | 更新日期: 2023-09-27 18:22:11

我的字符串类似10130060/1151015/0017164

要将字符串的粗体部分转换为日期即15/10/2015

将指定字符串拆分为日期

这还不完全清楚,但当你用粗体部分说时,如果你的意思是总是在第一个/和第二个/字符之间,你可以用/分割字符串,并用ParseExact方法将其解析为DateTime

var s = "10130060/151015/0017164";
var dt = DateTime.ParseExact(s.Split('/')[1], "ddMMyy", CultureInfo.InvariantCulture);
Console.WriteLine(dt); // 15/10/2015

但请记住,正如其他人所评论的,由于您需要使用yy格式说明符,因此该说明符使用提供的区域性Calendar.TwoDigitYearMax属性。

此属性允许将2位数的年份正确转换为4位数年份。例如,如果此属性设置为2029100年的范围是从1930年到2029年。因此,2位数的值为30被解释为1930,而2位数的值29被解释为2029.

对于InvariantCulture,它被设置为2029。这就是为什么15会被解析为2015,而76会被解析成1976

顺便说一句,如果您的单日和月度数字没有像5101515515那样的前导零,我的解决方案就不起作用。在这种情况下,您需要使用d和/或M格式说明符。

thanx作为答案,但问题是这些数据是由运行时的用户,它将采用ddmmyy格式,年份部分它将只适用于本世纪。

首先,mmMM说明符是不相同的。mm说明符表示分钟,而MM说明符表示月份。所有自定义日期和时间说明符都区分大小写。

如果你总是想在21世纪解析你的两位数年份,你可以Clone一个使用公历作为Calendar属性的区域性,就像InvariantCulture一样,将其TwoDigitYearMax属性设置为2099,并在解析字符串时使用那个克隆的区域性。

var clone = (CultureInfo)CultureInfo.InvariantCulture.Clone();
clone.Calendar.TwoDigitYearMax = 2099;
var dt = DateTime.ParseExact(s.Split('/')[1], "ddMMyy", clone);

您的151015将解析为15/10/2015,而您的151076将解析为15/10/2076

我会逐位拆分字符串。下面是一个返回字符串数组的函数。每个字符串都有相同的长度。

    public static string[] SplitBitforBit(string text, int bitforbit)
    {
        int splitcount = Convert.ToInt32(RoundAt(text.Length / bitforbit, 0, 0));
        char[] allChars = text.ToCharArray();
        string[] splitted = new string[splitcount];
        int iL = 0;
        for (int i = 0; i != splitted.Length; i++)
        {
            splitted[i] = null;
            for (int j = 0; j != bitforbit; j++)
            {
                splitted[i] += allChars[iL];
                iL++;
            }
        }
        return splitted;
    }

如果您将Position和startUp设置为0:,RoundAt方法将自动取整

    public static double RoundAt(double Number, int Position, int startUp)
    {
        double Up = Math.Abs(Number) * Math.Pow(10, Position);
        double temp = Up;
        double Out;
        while (Up > 0)
        {
            Up--;
        }
        Out = temp - Up;                           //Up
        if (Up < (Convert.ToDouble(startUp) - 10) / 10)
        { Out = temp - Up - 1; }                   //Down
        if (Number < 0)
        { Out *= -1; }
        Out /= Math.Pow(10, Position);
        return Out;
    }

示例:

        string yourString = "171115";
        string[] splitted = SplitBitforBit(yourString, 2);
        int day = Convert.ToInt32(splitted[0]);
        int month = Convert.ToInt32(splitted[1]);
        int year = 2000 + Convert.ToInt32(splitted[2]);//!!! just for years since 2000
        DateTime yourDate = new DateTime(year, month, day);
        Console.WriteLine(yourDate);
        Console.ReadLine();