Man*_*oon 6 c# datetime parsing
我将一个字符串解析成DateTime数百万次:
public static CultureInfo ci = CultureInfo.InvariantCulture;
while (!reader.EndOfStream)
{
line = reader.ReadLine();
string[] fields = line.Split(' ');
DateTime newDT = DateTime.ParseExact(fields[0], "yyyyMMddTHHmmssfff", ci);
}
Run Code Online (Sandbox Code Playgroud)
我的探查器强调ParseExact是一个很大的时间.是否有任何其他方法/方法可以将字符串解析为更快的DateTime?
关注UP1:
1)我试过这个 - 但速度是一样的
bool OK = DateTime.TryParseExact(fields[0], "yyyyMMddTHHmmssfff", null, System.Globalization.DateTimeStyles.None,out DT);
Run Code Online (Sandbox Code Playgroud)
2)
我试着编写自己的解析器 - 但这也很慢:
public static DateTime fastParse(ref string s)
{
return new DateTime(int.Parse(s.Substring(0,4)), int.Parse(s.Substring(4,2)),int.Parse(s.Substring(6,2)), int.Parse(s.Substring(9,2)),int.Parse(s.Substring(11,2)),int.Parse(s.Substring(13,2)),int.Parse(s.Substring(15, 3)));
}
Run Code Online (Sandbox Code Playgroud)
关注UP2
我尝试了Master117存储值的建议 - 再说不快 - 也许问题是构造?
public class fastParseData
{
int year;
int mon;
int day;
int hour;
int min;
string previousSlice = "";
public DateTime fastParse(ref string s)
{
if (previousSlice != s.Substring(0, 12))
{
year=int.Parse(s.Substring(0,4));
mon=int.Parse(s.Substring(4,2));
day=int.Parse(s.Substring(6,2));
hour= int.Parse(s.Substring(9,2));
min = int.Parse(s.Substring(11,2));
previousSlice = s.Substring(0, 12);
}
return new DateTime(year, mon, day, hour,min, int.Parse(s.Substring(13, 2)), int.Parse(s.Substring(15, 3)));
}
}
Run Code Online (Sandbox Code Playgroud)
FOLOW UP3
public class fastParseData
{
int year;
int mon;
int day;
int hour;
int min;
string previousSlice = "";
DateTime previousDT;
public DateTime fastParse(ref string s)
{
if (previousSlice != s.Substring(0, 12))
{
year=int.Parse(s.Substring(0,4));
mon=int.Parse(s.Substring(4,2));
day=int.Parse(s.Substring(6,2));
hour= int.Parse(s.Substring(9,2));
min = int.Parse(s.Substring(11,2));
previousSlice = s.Substring(0, 12);
previousDT = new DateTime(year, mon, day, hour,min,0,0);
}
return previousDT.AddMilliseconds((int.Parse(s.Substring(13, 2))*1000)+int.Parse(s.Substring(15, 3)));
}
}
Run Code Online (Sandbox Code Playgroud)
关注UP4
从我的探查器来看,症结似乎是
int.Parse(s.Substring(13, 2))
Run Code Online (Sandbox Code Playgroud)
Parse位比子串更昂贵.
我试过了
int.TryParse(s.Substring(13, 2),NumberStyles.None,ci, out secs)
Convert.ToInt32(s.Substring(13, 2));
Run Code Online (Sandbox Code Playgroud)
但又一次 - 速度没有区别.
有没有更快的方法来解析int?
小智 7
拆分字符串的想法是在正确的轨道上,但子字符串很慢.每当我拆分字符串时,我都会使用字符访问器.yyyyMMddTHHmmssfff免责声明:T
public class DateParser1
{
private static System.String DateFormat="yyMMddTHHmmssfff";
public static System.DateTime GetDate(System.String SourceString, int Offset=0) // Offset eliminates need for substring
{
int Year=0;
int Month=0;
int Day=0;
int Hour=0;
int Minute=0;
int Second=0;
int HourOffset=0;
int MS=0;
if(SourceString.Length+Offset<DateFormat.Length) throw new System.Exception(System.String.Format("Date Too Short {0} For {0}",SourceString.Substring(Offset),DateFormat));
for(int i=0;i<DateFormat.Length;i++)
{
System.Char c=SourceString[Offset+i];
switch(DateFormat[i])
{
case 'y':
Year=Year*10+(c-'0');
break;
case 'M':
Month=Month*10+(c-'0');
break;
case 'd':
Day=Day*10+(c-'0');
break;
case 'T':
if(c=='p'||c=='P')
HourOffset=12;
break;
case 'h':
Hour=Hour*10+(c-'0');
if(Hour==12) Hour=0;
break;
case 'H':
Hour=Hour*10+(c-'0');
HourOffset=0;
break;
case 'm':
Minute=Minute*10+(c-'0');
break;
case 's':
Second=Second*10+(c-'0');
break;
case 'f':
MS=MS*10+(c-'0');
break;
}
}
if(Year>30) //Change For Your Business Rules
{
Year+=1900;
}
else
{
Year+=2000;
}
try
{
return new System.DateTime(Year,Month,Day,Hour+HourOffset,Minute,Second,MS);
}
catch(System.Exception)
{
throw new System.Exception(System.String.Format("Error In Date: {0}/{0}/{0} {0}:{0}:{0}.{0} - {0} {0}",Year,Month,Day,Hour+HourOffset,Minute,Second,MS,DateFormat,SourceString.SubString(Offset,DateFormat.Length)));
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以编写自己的解析算法,首先将字符串拆分为数组/列表/任何内容,然后使用日期时间构造函数来创建日期时间,
DateTime newDT = DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32);
Run Code Online (Sandbox Code Playgroud)
由于年/月/日不会改变那么快,您可以对它们进行缓冲,因此字符串操作的数量较少。
http://msdn.microsoft.com/de-de/library/vstudio/system.datetime.aspx
一个简单的方法是存储前 8 个字母,例如 string a = fields[0].slice(0,8) (目前不知道正确的操作),现在您解析它们并生成整数,但是在下一次运行中,您再次对它们进行切片并测试是否 a = new a,如果是,则使用上次的整数而不是再次解析它们,自然地,您需要存储 a 和整数
因此,现在问题似乎是构造时间,您应该尝试添加经过的时间,通过使用 addSecond 等检查您的整数是否比以前更高/更低,或者您可以采用您的构造并将值设置为新时间。
尝试这个:
public class fastParseData
{
int year;
int mon;
int day;
int hour;
int min;
string previousSlice = "";
DateTime previousDT;
public DateTime fastParse(ref string s)
{
if (previousSlice != s.Substring(0, 12))
{
year=int.Parse(s.Substring(0,4));
mon=int.Parse(s.Substring(4,2));
day=int.Parse(s.Substring(6,2));
hour= int.Parse(s.Substring(9,2));
min = int.Parse(s.Substring(11,2));
previousSlice = s.Substring(0, 12);
previousDT = new DateTime(year, mon, day, hour,min,0,0);
}
return previousDT.ParseExact(year, mon, day, hour,min, int.Parse(s.Substring(13, 2)), int.Parse(s.Substring(15, 3));
}
}
Run Code Online (Sandbox Code Playgroud)
这样您就可以创建 DT,然后设置新的时间
| 归档时间: |
|
| 查看次数: |
4889 次 |
| 最近记录: |