XStream действительно полезен в таких экземплярах. Вот простой код, чтобы сделать клонирование
private static final XStream XSTREAM = new XStream();
...
Object newObject = XSTREAM.fromXML(XSTREAM.toXML(obj));
Вы можете использовать функции:
TryStrToDate
TryStrToTime
TryStrToDateTime
Они пытаются преобразовать строку в дату / время, и если преобразование завершится успешно, оно вернет истину. Таким образом, не возникает никаких исключений.
Вы можете использовать необязательный параметр TFormatSettings, чтобы определить свой собственный формат.
Все функции определены в SysUtils.
Но есть некоторые элементы управления датой / временем, доступные в VCL, например TDateTimePicker и TMonthCalendar. Вы также можете их использовать.
Проблема в том, как определить «допустимый формат»? Возможно, лучшее, что вы могли бы сделать, это поискать наличие определенных букв в строке формата. Но что, если пользователю не важен год или он не хочет видеть время?
Я бы не стал особо беспокоиться о проверке того, что он ввел «допустимый формат». Скорее просто дайте им предварительный просмотр формата, который они ввели, используя текущую дату и время.
Редактировать : Обновление новой информации из 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, и, следовательно, также имеет другие правила для строк формата.
Так что я боюсь, что вам придется разрешить своим пользователям для настройки двух строк разных форматов. : (
Для расширения в 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;
Дуг и Gamecat, я считаю, что вы оба неправильно поняли вопрос.
DisplayDate: = FormatDateTime (UserDefinedFormat, Now ());
Единственное, что StrToDateTime (или TryStrToDateTime) может использоваться для попытки круговой «проверки согласованности». Но это было бы бесполезно, потому что нет гарантии, что пользователь хочет видеть все элементы даты / времени. Следовательно, круговая проверка не может работать!