日期格式转换(50分)

  • 主题发起人 主题发起人 hhjjhhjj
  • 开始时间 开始时间
H

hhjjhhjj

Unregistered / Unconfirmed
GUEST, unregistred user!
日期格式转换
Jul 03 10:52 -->'yyyy-mm-dd hh:mm:ss'
 
formatdatetime函数
formatdatetime('yyyy"-"mm"-"dd" "hh":......
参考DELPHI帮助,
S := FormatDateTime('"The meeting is on " dddd, mmmm d, yyyy, " at " hh:mm AM/PM', Now + 0.125);
 
formatdatetime('yyyy-mm-dd hh:mm:ss',DateTime)
 
formatdatetime('YYYY-MM-DD hh:mm:ss',now())
 
我是想问:
Jul 03 10:52 是不是有效的日期格式?
Jul 03 10:52 可不可以转换为 'yyyy-mm-dd hh:mm:ss'格式的形式?
 
你的"Jul 03 10:52"从何从而来,
如果是系统,就可以转成DateTime,再formatdatetime
如果是文本,你可以写一个查找,再转换就OK
 
function IsDateTime(DateTime:string):boolean;
begin
try
strtodatetime(DateTime);
result:=true;
except
result:=false;
end;
end;
//自己写一个这样的函数,或者使用TryStrToDateTime()函数
 
应该function IsDateTime(var DateTime:string):boolean;
 
瞎说,不需要改变DateTime的值,为什么使用变参?
 
Jul 03 10:52 是一个文本,有没办法把它转换成 'yyyy-mm-dd hh:mm:ss'格式的形式?
 
写个字符串分割函数就可以了吧,不麻烦。
 
话题1113891的标题是: 日期转换函数 (50分)
分类:非技术问题 payer (2002-05-21 11:26:00)
怎样把
23/jan/2002
这样的日期格式转换为
2002-01-23

peng_qs (2002-05-21 11:31:00)
先用StrToDateTime转换,再用FormatDateTime.

payer (2002-05-21 11:36:00)
用StrToDateTime已经说我的日期格式错误了!
:(

jadyyarcoo (2002-05-21 11:36:00)
用formatdatetime

yangyugw (2002-05-21 11:46:00)
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;


yczjs (2002-05-21 11:41:00)
ShortDataFormat='yyyy-mm-dd'
StrToDateTime
Please try it

yangyugw (2002-05-21 11:49:00)
我忘问了,你哪里来得这样的日期呢
23/jan/2002
你楼上兄弟这个设置
ShortDataFormat='yyyy-mm-dd'
那么你是不会通过
date()得到你那格式的日期的


book523 (2002-05-21 11:52:00)
应该先分离出年,月,日,在组合成字符串
然后用strtodatetime就得到日期变量了

payer (2002-05-21 11:56:00)
其实我在开发一个winroute上网记录的分析软件
它的代理日志的日期时间格式为
23/jan/2002:15:11:12
日期/月/年:时:分:秒
其实我都想到怎样转换它的,只是方法很笨
不知道有没有快一点的方法转换这个格式呢?

yangyugw (2002-05-21 12:02:00)
:)我的方法也是个苯方法!基本上和你的差不多吧

WilliamGui (2002-05-21 12:13:00)
只有写一个

breeze (2002-05-21 13:33:00)
我觉得最简单的方法,是对这个字符串进行一下预处理。例:
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这种格式,但不能转换这种格式)

sunboy_del (2002-05-21 13:48:00)
没错!我也遇到过这种情况,没办法只有把机子的日期改了!

payer (2002-05-21 14:23:00)
to breeze
你的方法是简单方便,但是运行的速度应该不够yangyugw的快
我现在正在写代码,写好了传上来给大家骂一下!

payer (2002-05-21 15:31:00)
其实它的日期格式为
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;

大家觉得我应该怎样优化这段代码?谢谢!

yangyugw (2002-05-21 16:14:00)
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;
这样写可能速度会快吧



payer (2002-05-21 16:15:00)
但是用了这么多的ord和*
case会比select快吗?可能虽然做一下实验了!

yangyugw (2002-05-21 16:23:00)
我的意思是先计算出
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快吧
我写这个其实只开阔一下思路而已,见笑了

payer (2002-05-21 16:44:00)
我试过了,用下面的方法,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;

各位还有什么好方法吗?

drawpharos (2002-05-21 17:05:00)
用一枚举变量,放12个月的英文名称,因为枚巨变量是可计数的,因此可以直接用case
不用楼上的各位做得那么多ord

payer (2002-05-21 17:12:00)
to drawpharos:
可以教我怎样用杦举变量吗?谢谢!

Fanny501 (2002-05-21 17:20:00)
1。设为 ShortDataFormat
2。跟drawpharos说的那样,用。。。。


yangyugw (2002-05-21 17:20:00)
to drawpharos
type
month(jan,Feb,.....,Dec)
这是你要定义的枚举吧
可是你要看看payer的月份是个string
我真的不知道怎么用枚举和字符窜比较



zyf23 (2002-05-21 17:46:00)
gz...


提前

payer (2002-05-25 1:36:00)
up~~~

payer (2002-07-13 1:35:00)
算了,就用这个算法了
 
可以写一个函数进行转换
 
多人接受答案了。
 
后退
顶部