Как проверить, является ли строка допустимой Строкой формата DateTime в Delphi

XStream действительно полезен в таких экземплярах. Вот простой код, чтобы сделать клонирование

private static final XStream XSTREAM = new XStream();
...

Object newObject = XSTREAM.fromXML(XSTREAM.toXML(obj));
11
задан Re0sless 4 December 2009 в 11:45
поделиться

4 ответа

Вы можете использовать функции:

TryStrToDate
TryStrToTime
TryStrToDateTime

Они пытаются преобразовать строку в дату / время, и если преобразование завершится успешно, оно вернет истину. Таким образом, не возникает никаких исключений.

Вы можете использовать необязательный параметр TFormatSettings, чтобы определить свой собственный формат.

Все функции определены в SysUtils.

Но есть некоторые элементы управления датой / временем, доступные в VCL, например TDateTimePicker и TMonthCalendar. Вы также можете их использовать.

18
ответ дан 3 December 2019 в 04:32
поделиться

Проблема в том, как определить «допустимый формат»? Возможно, лучшее, что вы могли бы сделать, это поискать наличие определенных букв в строке формата. Но что, если пользователю не важен год или он не хочет видеть время?

Я бы не стал особо беспокоиться о проверке того, что он ввел «допустимый формат». Скорее просто дайте им предварительный просмотр формата, который они ввели, используя текущую дату и время.

Редактировать : Обновление новой информации из OP

Было небольшое разъяснение по вопросу:

На самом деле Мне нужно указать свойство Format полей TDateTimePicker и TDateTime в базе данных. И я хочу, чтобы пользователь мог изменять эти форматы. - Тофик Гасанов

Это важное уточнение, возможно, вы хотите включить его в свой вопрос?

Важно то, что строка формата будет указывать не только на формат отображения, но и на формат редактирования. Хотя практически любая строка допустима, не все из них особенно полезны (особенно для редактирования). Например:

FDateTimeFormat := '"The day is "d" of this month of the year "yy';

Это совершенно верно в том смысле, что ваша дата может быть отформатирована соответствующим образом. Однако это не особенно полезно для установки месяца.

ИМХО, если пользователь хочет усложнить себе жизнь, не включив поля месяца в строку формата - сложно! Проблема, однако, заключается в том, что правила форматирования немного технические, и пользователь может перепутать месяцы и минуты. Например, FTimeFormat: = 'HH: MM: SS' , который на самом деле составляет <часы>: < месяцев >: <секунды>

Даже в этом случае,

procedure TConfigDialog.DateTimeFormatChange(Sender: TObject);
var
  LCheckDate: TDateTime;
  LFormattedDate: String;
begin
  LCheckDate := EncodeDate(1999, 12, 31) + EncodeTime(20, 45, 50, 123);
  LFormattedDate := FormatDateTime(DateTimeFormat.Text, LCheckDate);
  DateFormatSample.Caption := 'Fri 31 December 1999 at 8:45:50.123 would be displayed as: ' + LFormattedDate;
end;

ПРЕДУПРЕЖДЕНИЕ

Вы упомянули, что хотите использовать это как для TDateTimeField , так и для TDateTimePicker . К сожалению, TDateTimePicker просто обертывает встроенный элемент управления Windows, который не использует FormatDateTime, и, следовательно, также имеет другие правила для строк формата.

Так что я боюсь, что вам придется разрешить своим пользователям для настройки двух строк разных форматов. : (

4
ответ дан 3 December 2019 в 04:32
поделиться

Для расширения в Gamecat ' s answer

If not tryStrToDateTime(Edit1.text,MyDateTimeVar) then
ShowMessage('You need to make your entry look like a date...how about yy/mm/dd');

Если вы просто хотите проверить это, не настраивая переменную MyDateTimeVar для передачи в tryStrToDateTimeVar, вы можете просто использовать обработку исключений

try
StrToDateTime(Edit1.Text);
except
ShowMessage('You need to make your entry look like a date...how about yy/mm/dd');
end;
1
ответ дан 3 December 2019 в 04:32
поделиться

Дуг и Gamecat, я считаю, что вы оба неправильно поняли вопрос.

  • Он не хочет переходить от строки к дате.
  • У него есть дата.
  • ] Он хочет преобразовать эту дату в строку в соответствии с форматом, указанным пользователем.
  • То есть DisplayDate: = FormatDateTime (UserDefinedFormat, Now ());

Единственное, что StrToDateTime (или TryStrToDateTime) может использоваться для попытки круговой «проверки согласованности». Но это было бы бесполезно, потому что нет гарантии, что пользователь хочет видеть все элементы даты / времени. Следовательно, круговая проверка не может работать!

1
ответ дан 3 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: