datetime.compare的简单介绍

http://www.itjxue.com  2023-01-26 05:57  来源:未知  点击次数: 

DateTime.Compare()怎么比较24小时制(急)

08:00:00 当然比 19:00:00 小,

其中Convert.ToDateTime(up)我设置的是08:00:00 ,你的这个设置,计算机认为设置的是早上8点,而无法识别为晚上8点,所以返回true;

只能按24小时制来解析时间对象,,DateTime 是由一堆数字来表示时间的,那些toString("HH:mm:ss")等只是以不同方式显示

C#通过什么函数比较Datetime类型数据的大小?

DateTime date = new DateTime();

DateTime value = DateTime.Now;

if( date .CompareTo(value)){......}直接这样就好了返回值:小于零 此实例早于 value。零 此实例与 value 相同。大于零 此实例晚于 value。

DELPHI数据比较问题

这是个基本的求差集的问题,按你的需求,似乎只是“整行”的差集,与行的结构无关。关键是先排序再处理,大致过程如下:

1、用两个StringList分别装载A.txt和B.txt

2、对两个StringList分别排序

3、模仿归并排序的算法处理,时间复杂度是O(m+n),如果不排序就处理,将是O(m*n)。

咱写过一个叫做LineSub的命令行工具程序,代码如下,你可以编译后留用,或参考一二;编译出LineSub.exe之后,执行LineSub A.txt B.txt C.txt即能满足你的要求,不提供参数运行,则显示用法。

program lineSub;

{$APPTYPE CONSOLE}

uses Classes, SysUtils, DateUtils;

procedure ShowUsageAndExit;

const

C_sUsageFormat : string =

'用法:%s 文本文件#1(输入) 文本文件#2(输入) 结果文件(输出) [ 选项参数]'#$0D#$0A +

'说明:求两个文本文件的差集,结果另外保存到一个文件'#$0D#$0A +

'原理:模仿二路归并排序......'#$0D#$0A +

'选项:支持以下5种选项参数,均有缺省值,可被忽略或任意组合'#$0D#$0A +

' -S 0|1——是否需要先对两个文本文件进行排序'#$0D#$0A +

' 缺省为1,即需要排序之预处理;'#$0D#$0A +

' 若确保输入文件均已按照UTF-16LE编码排序,可设为0以提高效率'#$0D#$0A +

' 若不能确认文件已排序,则应采用缺省配置,以保证结果的准确性'#$0D#$0A +

' -K 0|1——处理过程保持原始文件中的行顺序'#$0D#$0A +

' 缺省为“是”,即差集行的顺序同其原来在文本文件#1中的顺序'#$0D#$0A +

' -U 0|1——保存结果为UTF-16LE编码格式'#$0D#$0A +

' 缺省为“否”,即保存为系统当前字符集格式'#$0D#$0A +

' -Q 0|1——是否静默模式,静默将不显示处理消息。缺省为“是”'#$0D#$0A +

' -P 数字——每处理多少行输出一次进度。缺省为“否”,即不显示进度';

var

s : string;

begin

s := ChangeFileExt( ExtractFileName( ParamStr(0) ), '' );

s := Format( C_sUsageFormat, [ s ] );

Writeln( ErrOutput, s );

Halt;

end;

function GetCmdArguments(

var sFN1, sFN2, sFN_Save : string;

var nLC_ShowProgress : Integer;

var bNeedSort : Boolean;

var bKeepOrder : Boolean;

var bSaveAsUTF16LE : Boolean;

var bDisplayMessage : Boolean

) : Boolean;

var

i : Integer;

m : Integer;

n : Integer;

s : string;

C : Char;

begin

Result := False;

n := ParamCount;

if n 3 then

Exit;

sFN1 := '';

sFN2 := '';

sFN_Save := '';

nLC_ShowProgress := 0;

bNeedSort := True;

bKeepOrder := True;

bSaveAsUTF16LE := False;

bDisplayMessage := False;

m := 0;

for i := 1 to n do

begin

s := ParamStr(i);

{ 处理选项参数 }

if ( s[1] = '-' ) or ( s[1] = '/' ) then

begin

// 选项参数字符串格式为:[-/][PKS]数字,最短三个字符,不足的一定不正确

if Length( s ) 3 then

Exit;

// 获取参数种类

C := s[2];

// 只保留参数值

Delete( s, 1, 2 );

{ 根据参数种类,检查相应的参数值是否合格,不合格则忽略,以采用缺省值 }

case C of

'K', 'k':

begin

if s[3] = '0' then

bKeepOrder := False;

end;

'P', 'p':

begin

nLC_ShowProgress := StrToIntDef( s, 0 );

end;

'Q', 'q':

begin

if s[3] = '0' then

bDisplayMessage := True;

end;

'S', 's':

begin

if s[3] = '0' then

bNeedSort := False;

end;

'U', 'u':

begin

if s[3] '0' then

bSaveAsUTF16LE := True;

end

else // 参数种类不对,直接退出

Exit;

end;

Continue;

end;

{ 处理文件名 }

Inc( m );

case m of

1: sFN1 := s;

2: sFN2 := s;

3: sFN_Save := s;

end;

end;

// 必要参数不足,返回失败

if m 3 then

Exit;

if not FileExists( sFN1 ) then

Exit;

if not FileExists( sFN2 ) then

Exit;

Result := True;

end;

procedure ShowProgress( nCount1, nCount2, nStep : Integer; bLast : Boolean = False );

const

C_sProgressFormat : string = #$0D' 进度:%d, %d';

var

s : string;

begin

if nStep = 0 then

Exit;

if bLast or ( nStep = 1 ) or ( ( nCount1 + nCount2 ) mod nStep = 0 ) then

begin

s := Format( C_sProgressFormat, [ nCount1, nCount2 ] );

Write( ErrOutput, s );

if bLast then

Writeln( ErrOutput );

end;

end;

function CompareByString( SL : TStringList; I, J : Integer ) : Integer;

begin

if I = J then

Result := 0

else

Result := CompareStr( SL[I], SL[J] );

end;

function CompareByNumber( SL : TStringList; I, J : Integer ) : Integer;

begin

if I = J then

Result := 0

else

Result := Integer( SL.Objects[I] ) - Integer( SL.Objects[J] );

end;

{ 将负整数、0、正整数归一到-1、0、1,方便用case语句处理分支 }

function UnifySignedInteger( N : Integer ) : Integer; inline;

begin

if N 0 then

Result := -1

else

if N 0 then

Result := 1

else

Result := 0;

end;

{ 字符串比较大小,返回-1、0、1,用于排序的回调函数 }

function StrCompResult( S1, S2 : string ) : Integer;

begin

Result := UnifySignedInteger( CompareStr( S1, S2 ) );

end;

procedure PrintEllapsed( t0 : TDateTime ); inline;

const

C_sEF : string = ' 耗时:%.0n 毫秒';

begin

Writeln( ErrOutput, Format( C_sEF, [ MillisecondSpan( Now, t0 ) ] ) );

end;

{ 设置字符串列表中各个字符串的顺序 }

procedure SetStringOrder( SL : TStringList );

var

i : Integer;

begin

for i := 0 to SL.Count - 1 do

SL.Objects[i] := TObject( i );

end;

{ 计算字符串列表的行差集 }

procedure ComputeSubStrings( SL1, SL2, slSave : TStringList; nLC_Progress : Integer );

var

I, J : Integer;

begin

I := 0;

J := 0;

while ( I SL1.Count ) and ( J SL2.Count ) do

begin

ShowProgress( I, J, nLC_Progress );

case StrCompResult( SL1[I], SL2[J] ) of

-1:

begin

slSave.AddObject( SL1[I], SL1.Objects[I] );

Inc( I );

end;

0:

begin

Inc( I );

Inc( J );

end;

1:

begin

Inc( J );

end;

end;

end;

{ 输出第一个文件中的剩余部分 }

while I SL1.Count do

begin

ShowProgress( I, J, nLC_Progress );

slSave.AddObject( SL1[I], SL1.Objects[I] );

Inc( I );

end;

// 最后一次显示进度

ShowProgress( I, J, nLC_Progress, True );

end;

var

t0 : TDateTime;

t00 : TDateTime;

iProcessStep : Integer;

nLC_Progress : Integer;

sFN_Text1 : string;

sFN_Text2 : string;

sFN_Save : string;

slText1 : TStringList;

slText2 : TStringList;

slSave : TStringList;

bNeedSort : Boolean;

bKeepOrder : Boolean;

bSaveAsUTF : Boolean;

bShowHint : Boolean;

begin

{ 获取命令行参数,如不正确,则显示用法后立即退出... }

if not GetCmdArguments(

sFN_Text1, sFN_Text2, sFN_Save,

nLC_Progress,

bNeedSort, bKeepOrder, bSaveAsUTF, bShowHint

) then

ShowUsageAndExit;

t00 := Now;

if bShowHint then

begin

Writeln( ErrOutput, Format( '文本文件#1:[%s]', [ sFN_Text1 ] ) );

Writeln( ErrOutput, Format( '文本文件#2:[%s]', [ sFN_Text2 ] ) );

Writeln( ErrOutput, Format( '保存文件 :[%s]', [ sFN_Save ] ) );

Writeln( ErrOutput );

end;

slText1 := TStringList.Create;

slText2 := TStringList.Create;

slSave := TStringList.Create;

iProcessStep := 1;

t0 := Now;

try

{ 装载原始文本文件... }

if bShowHint then

Write( ErrOutput, Format( '%d 装载文件', [ iProcessStep ] ) );

slText1.LoadFromFile( sFN_Text1 );

slText2.LoadFromFile( sFN_Text2 );

if bShowHint then

begin

PrintEllapsed( t0 );

Inc( iProcessStep );

end;

{ 如果需要保持原有顺序,则预先设置原顺序标记... }

if bKeepOrder then

begin

if bShowHint then

begin

Write( ErrOutput, Format( '%d 预设原始行的顺序标记', [ iProcessStep ] ) );

t0 := Now;

end;

SetStringOrder( slText1 );

SetStringOrder( slText2 );

if bShowHint then

begin

PrintEllapsed( t0 );

Inc( iProcessStep );

end;

end;

{ 如原始文本未排序,则首先排序,以便大幅提高处理性能... }

if bNeedSort then

begin

if bShowHint then

begin

Write( ErrOutput, Format( '%d 对原始文件排序', [ iProcessStep ] ) );

t0 := Now;

end;

slText1.CustomSort( @CompareByString );

slText2.CustomSort( @CompareByString );

if bShowHint then

begin

PrintEllapsed( t0 );

Inc( iProcessStep );

end;

end;

{ 根据归并排序原理,输出第一个文件中有而第二个文件中无的行... }

if bShowHint then

begin

Writeln( ErrOutput, Format( '%d 求文本行之差集', [ iProcessStep ] ) );

t0 := Now;

end;

ComputeSubStrings( slText1, slText2, slSave, nLC_Progress );

if bShowHint then

begin

PrintEllapsed( t0 );

Inc( iProcessStep );

end;

{ 如需保持原有顺序,则恢复之... }

if bKeepOrder then

begin

if bShowHint then

begin

Write( ErrOutput, Format( '%d 恢复差集行的原有顺序', [ iProcessStep ] ) );

t0 := Now;

end;

slSave.CustomSort( @CompareByNumber );

if bShowHint then

begin

PrintEllapsed( t0 );

Inc( iProcessStep );

end;

end;

{ 保存结果文件... }

if bShowHint then

begin

Write( ErrOutput, Format( '%d 保存文件', [ iProcessStep ] ) );

t0 := Now;

end;

if bSaveAsUTF then

slSave.SaveToFile( sFN_Save, TEncoding.Unicode )

else

slSave.SaveToFile( sFN_Save );

if bShowHint then

begin

PrintEllapsed( t0 );

Writeln( ErrOutput, Format( '--- 总计耗时:%.2n 秒', [ SecondSpan( Now, t00 ) ] ) );

end;

finally

slSave.Free;

slText2.Free;

slText1.Free;

end;

end.

(责任编辑:IT教学网)

更多

推荐免费资源文章