将指定的字符串拆分为日期

时间:2015-11-17 13:19:31

标签: c# string datetime

我的字符串如10130060 / 151015 / 0017164

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

2 个答案:

答案 0 :(得分:3)

目前还不完全清楚,但如果你说带有粗体部分,,如果你的意思是总是在第一个timeStamp,elapsed,label,responseCode,Latency 1447675626444,9,API1,201,9 1447675626454,1151,API2,404,Not Found,1151 和第二个/字符之间,您可以使用/拆分字符串,然后使用ParseExact方法将其解析为/

DateTime

但请记住,正如其他人评论的那样,由于您需要使用yy format specifier,因此此说明符使用提供的文化Calendar.TwoDigitYearMax property

  

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

对于var s = "10130060/151015/0017164"; var dt = DateTime.ParseExact(s.Split('/')[1], "ddMMyy", CultureInfo.InvariantCulture); Console.WriteLine(dt); // 15/10/2015 ,它设置为InvariantCulture。这就是为什么2029将被解析为152015将被解析为76的原因。

顺便说一句,我的解决方案无效如果您的单日和月份数字没有197651015 leading zero。在这种情况下,您需要使用15515和/或d格式说明符。

  

thanx的答案,但问题是这个数据是由   用户在运行时,它将采用ddmmyy格式,即年份部分   是固定的,只会是本世纪。

首先,Mmm说明符不相同。 MM说明符是分钟,但mm说明符是几个月。所有custom date and time specifiers都区分大小写。

如果您总是想解析21世纪的两位数年份,您可以Clone将使用公历作为MM属性的文化Calendar设置为InvariantCulture,将其设置为&#39} 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

答案 1 :(得分:0)

我会把字符串比特分开。这是一个返回字符串数组的函数。每个字符串的长度都相同。

    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();