datetime.compare的简单介绍
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.