将指定字符串拆分为日期
本文关键字:日期 拆分 字符串 | 更新日期: 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
。
顺便说一句,如果您的单日和月度数字没有像51015
或15515
那样的前导零,我的解决方案就不起作用。在这种情况下,您需要使用d
和/或M
格式说明符。
thanx作为答案,但问题是这些数据是由运行时的用户,它将采用ddmmyy格式,年份部分它将只适用于本世纪。
首先,mm
和MM
说明符是不相同的。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();