Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
4 / 4 / 0
Регистрация: 29.01.2013
Сообщений: 115
1

Неверно сравнивает даты функция CompareDateTime

01.02.2017, 21:00. Показов 1419. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Delphi
1
2
3
4
5
6
7
8
9
function DateListSortDesc(List: TStringList; Index1, Index2: Integer): Integer;
{- функция для пользовательской сортировки списков даты и времени в обратном порядке}
begin
  Result := - CompareDateTime(StrToDateTime(List[Index1]), StrToDateTime(List[Index2]));
end;
 
var sl: TStringList;
.....
sl.CustomSort(DateListSortDesc);
Вот как отсортировался мой список в обратном порядке:
01.02.2017 22:41:29
01.02.2017 22:42:12
01.02.2017 22:42:26
01.02.2017 22:40:09

Почему???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2017, 21:00
Ответы с готовыми решениями:

Триггер сравнивает две даты
Пытаюсь написать триггер который сравнивает две даты. Даты сделки, не может быть раньше чем дата...

Создать метод, который сравнивает две даты
Нужно создать метод, который сравнивает две даты, переданные в строковой переменной, и результат...

Работа со строками. : Создать метод, который сравнивает две даты, переданные в строковой переменной
Помогите написать программу Создать метод, который сравнивает две даты, переданные в строковой...

Неверно распознается формат даты
Может кто-то за деньги помочь написать функцию для работы с буфером обмена в excel? Задача: При...

5
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,426
01.02.2017, 21:06 2
Какие конкретно строки сравниваются?
0
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
01.02.2017, 21:19 3
У меня Ваша функция отсортировала в обратном порядке правильно.
Код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
unit MainU;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses dateutils;
 
function DateListSortDesc(List: TStringList; Index1, Index2: Integer): Integer;
{- функция для пользовательской сортировки списков даты и времени в обратном порядке}
begin
  Result := - CompareDateTime(StrToDateTime(List[Index1]), StrToDateTime(List[Index2]));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
sl: TStringList;
begin
sl:=tstringlist.Create;
sl.assign(memo1.Lines);
sl.CustomSort(DateListSortDesc);
memo1.Lines.Assign(sl);
sl.Free;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
 
end.
Прилагаю проект на Delphi.
Вложения
Тип файла: zip Test.zip (203.4 Кб, 1 просмотров)
0
4 / 4 / 0
Регистрация: 29.01.2013
Сообщений: 115
01.02.2017, 21:55  [ТС] 4
А у Вас какие строки в Memo1.Lines ?

Я получал каждый раз строку с помощью DateTimeToString(sDate, 'dd.mm.yyyy hh:nn:ss', Now)
И после добавления новой строки в строковый список - сортировал его с помощью CompareDateTime
И почему то сортировка была с ошибками, как я привёл в примере в своём первом сообщении.

Тогда я решил кстати переставить местами день и год, и отсортировать список с помощью AnsiCompareText,
которая не ошибается)) Но получил фигу - так как в календаре Windows стоит формат, где год НЕ на первом
месте, то DecodeDate (и другие кстати тоже, типа FormatDateTime) - стали выдавать ошибку "...not valid date and time".

Перестанавливаю формат в календаре системы - начинают работать... Что за чепуха думаю? А если на компе
пользователя по другому выставлено будет - функции работающие с датой у меня выходит начнут ошибку выдавать?
Как избавиться от зависимости этой - тоже вот для меня вопрос, который пока не могу понять...

Добавлено через 12 минут
Простите, я ошибся: не FormatDateTime выдаёт ошибку, а функции перевода строки,
в которой год на первом месте, такие как StrToDateTime, DateTimeToString.

И вот зависимость этих функций от установок календаря Windows и создаёт сложность.
0
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
01.02.2017, 22:12 5
У меня в поле Memo1.Lines строки:
01.02.2017 22:41:29
01.02.2017 22:42:12
01.02.2017 22:42:26
01.02.2017 22:40:09
После сортировки они выводятся в порядке убывания времени.
Но как я вижу Вы уже разобрались.
0
4 / 4 / 0
Регистрация: 29.01.2013
Сообщений: 115
01.02.2017, 22:56  [ТС] 6
C зависимостью StrToDateTime и DateTimeToString от Windows - да, похоже разобрался...

Вот такой код заставляет их работать:

Delphi
1
2
3
4
5
6
7
8
9
var
  fs: TFormatSettings;
begin
  fs.DateSeparator := '.';
  fs.TimeSeparator := ':';
  fs.ShortDateFormat := 'yyyy.mm.dd';
  fs.ShortTimeFormat := 'hh24:mi:ss';
.....................
  StrToDateTime(MyString, fs)
А вот как быть с сортировкой через CompareDateTime - пока не знаю))

Добавлено через 19 минут
... пока что то менял и переставлял в коде - заработала правильно и сортировка)
но жаль что не смог понять почему неправильно работала до этого...
0
01.02.2017, 22:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2017, 22:56
Помогаю со студенческими работами здесь

Какая функция сравнивает строку s2 со строкой s1?
Какая функция сравнивает строку s2 со строкой s1?

Функция которая сравнивает текущую дату с заданной
У меня есть функция для получения текущей даты, но я не знаю как записать, сравнить и узнать какая...

Функция неправильно сравнивает содержимое файла и элемента структуры
Вот такая ситуация... Есть клочек кода: #include <stdio.h> #include <iostream> #include...

Функция сравнивает две строки, игнорируя различия в регистрах
Я студент 1 курса на зачёт сказали написать программку помогите!! не хочу вылететь из универа С++...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru