日期转换函数(50分)

  • 主题发起人 主题发起人 payer
  • 开始时间 开始时间
P

payer

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样把
23/jan/2002
这样的日期格式转换为
2002-01-23
 
先用StrToDateTime转换,再用FormatDateTime.
 
用StrToDateTime已经说我的日期格式错误了!
:(
 
用formatdatetime
 
ShortDataFormat='yyyy-mm-dd'
StrToDateTime
Please try it
 
var str,strdatetime:string;
i,j,day,year,monthi:word;
month:string;
strdatatime:='23/jan/2002'
j:=1
for i:=1 to high(strdatetime)
begin

if strdatetime='/' then
begin
if j=1 then
begin
day:=strtoint(str);
j:=j+1;
end;
if j=2 then
begin
mouth:=str;
j:=j+1;
end;
if j=3 then
begin
year:=strtoint(str);
j:=j+1;
end;

end //endif
else
str:=strdatetime;
end;
//end for

到这里你获得了
day,month,year
下面自己组合就可以啦
关于month你就要麻烦点
一步步判断month判断
if jan then
monthi:=1;
最后你用这个函数
EncodeDate(Year, Month, Day: Word): TDateTime;
 
我忘问了,你哪里来得这样的日期呢
23/jan/2002
你楼上兄弟这个设置
ShortDataFormat='yyyy-mm-dd'
那么你是不会通过
date()得到你那格式的日期的
 
应该先分离出年,月,日,在组合成字符串
然后用strtodatetime就得到日期变量了
 
其实我在开发一个winroute上网记录的分析软件
它的代理日志的日期时间格式为
23/jan/2002:15:11:12
日期/月/年:时:分:秒
其实我都想到怎样转换它的,只是方法很笨
不知道有没有快一点的方法转换这个格式呢?
 
:)我的方法也是个苯方法!基本上和你的差不多吧
 
只有写一个
 
我觉得最简单的方法,是对这个字符串进行一下预处理。例:
s := '23/jan/2002';
s := StringReplace(s,'Jan','01',[rfReplaceAll]);
s := StringReplace(s,'Feb','02',[rfReplaceAll]);
.....
s := StringReplace(s,'Dec','12',[rfReplaceAll]);
//这一段可以写一函数
ShortDateFormat := 'yyyy-mm-dd';
d := StrToDate(s);
这是Date,对于Time,通过设置ShortTimeFormat应该直接可以转换。
(Date之所以不能转换,是因StrTodate所要求的Str是要包含三个数字的。Delphi
能显示23-Jan-2002这种格式,但不能转换这种格式)
 
没错!我也遇到过这种情况,没办法只有把机子的日期改了!
 
to breeze
你的方法是简单方便,但是运行的速度应该不够yangyugw的快
我现在正在写代码,写好了传上来给大家骂一下!
 
其实它的日期格式为
dd/mmm/yyyy:hh:nn:ss
转换为
yyyy-mm-dd hh:nn:ss
TempVar:='23/Jan/2002:13:14:11';
Year:= Copy(TempVar, 8, 4);
Month:= Copy(TempVar, 4, 3);
Date:= Copy(TempVar, 1, 2);
if Month='Jan' then
Month:='01'
else
if Month='Feb' then
Month:='02'
else
if Month='Mar' then
Month:='03'
else
if Month='Apr' then
Month:='04'
else
if Month='May' then
Month:='05'
else
if Month='Jun' then
Month:='06'
else
if Month='Jul' then
Month:='07'
else
if Month='Aug' then
Month:='08'
else
if Month='Sep' then
Month:='09'
else
if Month='Oct' then
Month:='10'
else
if Month='Nov' then
Month:='11'
else
if Month='Dec' then
Month:='12';
StrLen:= Length(TempVar);
TempVar:= Copy(TempVar, Pos(':', TempVar)+1, StrLen-Pos(':', TempVar));
DateTimeVar:= Year+'-'+Month+'-'+Date+' '+TempVar;
大家觉得我应该怎样优化这段代码?谢谢!
 
VAR sing_int:integer;
sing_str:string;
Month:string;
//month 是上面你的
// Month:= Copy(TempVar, 4, 3);
sing_int:=ord(Month[1])*256*256+ord(Month[2])*256+ord(Month[3]);//这句也可以改成左移
case sing_int of
// ord('j')*256*256+ord('a')*256+ord('n')*256://这里最好先计算好就用这个公式
//假如ord('j')*256*256+ord('a')*256+ord('n')*256的结果是382333
382333:
begin
Month:='01'
end;
.....
.....
end;
这样写可能速度会快吧
 
但是用了这么多的ord和*
case会比select快吗?可能虽然做一下实验了!
 
我的意思是先计算出
ord('j')*256*256+ord('a')*256+ord('n')*256这个值在程序里面直接写
假如ord('j')*256*256+ord('a')*256+ord('n')*256的结果是382333
那么直接写入
382333:
begin
Month:='01'
end;
也就是说置计算一次用到ord的地方
sing_int:=ord(Month[1])*256*256+ord(Month[2])*256+ord(Month[3]);//这句也可以改成左移
我觉得case一定比if快吧
我写这个其实只开阔一下思路而已,见笑了
 
我试过了,用下面的方法,700条记录是比我的方法快1秒钟,
如果数据越多差据是越大,推荐!
case ord(Month[1])*256*256+ord(Month[2])*256+ord(Month[3]) of
4874606: Month:='01';
4613474: Month:='02';
5071218: Month:='03';
4288626: Month:='04';
5071225: Month:='05';
4879726: Month:='06';
4879724: Month:='07';
4289895: Month:='08';
5465456: Month:='09';
5202804: Month:='10';
5140342: Month:='11';
4482403: Month:='12';
end;

各位还有什么好方法吗?
 
用一枚举变量,放12个月的英文名称,因为枚巨变量是可计数的,因此可以直接用case
不用楼上的各位做得那么多ord
 
后退
顶部