In my code I am facing a problem. Example code:
var
d1: tdatetime
begin
d1 := strtodatetime('23/02/2011 12:34:56');
end;
but it’s giving the error:
’23/02/2011 12:34:56′ is not valid
date and time
What’s wrong with what I am doing?
Donal Fellows
132k18 gold badges147 silver badges213 bronze badges
asked Jul 25, 2010 at 19:26
2
the StrToDateTime function uses the ShortDateFormat
and DateSeparator
to convert the date part and the LongTimeFormat
and TimeSeparator
to the time part. so you string must match with theses variables to convert the string to TDateTime. instead you can use the StrToDateTime with the TFormatSettings
parameter, to parse you string.
function StrToDateTime(const S: string; const FormatSettings: TFormatSettings): TDateTime;
check this sample
Var
StrDate : string;
Fmt : TFormatSettings;
dt : TDateTime;
begin
fmt.ShortDateFormat:='dd/mm/yyyy';
fmt.DateSeparator :='/';
fmt.LongTimeFormat :='hh:nn:ss';
fmt.TimeSeparator :=':';
StrDate:='23/02/2011 12:34:56';
dt:=StrToDateTime(StrDate,Fmt);
answered Jul 25, 2010 at 19:43
RRUZRRUZ
135k19 gold badges356 silver badges483 bronze badges
2
Using VarToDateTime might be a lot simpler and it just works out of the box:
uses Variants;
newDateTime := VarToDateTime('23/02/2011 12:34:56');
answered Jul 11, 2015 at 10:48
KromsterKromster
7,1317 gold badges62 silver badges110 bronze badges
1
This is caused by the date/time format in your code not matching the date/time format for your locale settings.
From the docs (D2009):
The S parameter must use the current
locale’s date/time format. In the US,
this is commonly MM/DD/YY HH:MM:SS
format. Specifying AM or PM as part of
the time is optional, as are the
seconds. Use 24-hour time (7:45 PM is
entered as 19:45, for example) if AM
or PM is not specified.
If you are using an older Delphi, StrToDateTime may require a specific format. From the docs (D5 in this case):
The S parameter must be in the
MM/DD/YY HH:MM:SS format. Specifying
AM or PM as part of the time is
optional, as are the seconds. Use
24-hour time (7:45 PM is entered as
19:45, for example) if AM or PM is not
specified.
answered Jul 25, 2010 at 19:30
Marjan VenemaMarjan Venema
19.1k6 gold badges65 silver badges79 bronze badges
Прошу прощения, я ошибся и ввёл всех в заблуждение. Ошибку выдавала не строка с FormatDateTime
а следующая за ней строка, (если я переставлял местами год и день):
StrToDateTime(s);
Вот именно обратное преобразование — из строки в DateTime — зависит от Windows, и я не понимаю как
уйти от этой зависимости.
Пользователь добавляет в текстовый файл строки, в которых в виде строки остаются текущая дата и время записи.
Позже пользователю может понадобиться читать из этого файла строки, и нужно конвертировать уже строковое
представление в TDateTime. Ну и как быть тогда, если настройки Windows окажутся не совпадающими с теми,
с которыми сохранялся тот текстовый файл??
А FormatSettings — я же его вроде использовал… Или как то неправильно?
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Ошибка при преобразовании даты
, is not a valid date and time
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Member Рейтинг (т): 0 |
Когда пытаюсь выполнить такую команду strtodatetime(‘12.04.2005 21:12:56’); |
s-mike |
|
Цитата SkyLight @ 19.04.05, 19:43 Можно ли как то преобразовать формат даты? Ну, только заменой определенных символов. А что дата у тебя в проге хранится в текстовом виде? Лучше ее хранить как целое число. Если не нужно учитывать время, то это просто операция округления значения типа TDateTime. |
Shaggy |
|
Moderator Рейтинг (т): 130 |
function FormatDateTime(const Format: string; DateTime: TDateTime): string; overload; function FormatDateTime(const Format: string; DateTime: TDateTime; const FormatSettings: TFormatSettings): string; |
jack128 |
|
Moderator Рейтинг (т): 181 |
Scorpyему наоборот нужно..
begin ShortDateFormat := ‘d».»MM».»yyyy’; DateSeparator := ‘.’; TimeSeparator := ‘:’; ShowMessage(DateToStr(StrToDate(‘12.04.2005 21:12:56’))); end; |
Chow |
|
В общем случае задача тяжело решима, см.: РАБОТА С ДАТАМИ И ВРЕМЕНЕМ |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0570 ] [ 16 queries used ] [ Generated: 4.06.23, 03:02 GMT ]
Loading
Toad World by Quest
← →
ИМХО
(2004-02-13 16:49)
[0]
Если в панели управления («Язык и стандарты») для краткого формата даты стоит «МММ/дд/гг» (фев/13/04), то функция StrToDateTime возвращает ошибку
«фев/13/04 16:48:31 is not a valid date and time»
Как решить эту проблему?
← →
Anatoly Podgoretsky
(2004-02-13 17:04)
[1]
Ну не пользоваться таким извразенным форматом, зороший формат dd.mm.yyyy
← →
Семен Сорокин
(2004-02-13 17:05)
[2]
а если задать ShortDateFormat := «МММ/dd/yy» перед конвертацией?
← →
olookin
(2004-02-13 17:08)
[3]
Почитайте в хелпе Currency and date/time formatting variables поиск по ключевому слову DateSeparator. Если я не ошибаюсь — там приведены форматы дат, используемых в системе. Т.е. можно настроить для своей проги формат даты такой, какой используется в системе.
to [1] Anatoly Podgoretsky © (13.02.04 17:04)
Это все равно что сказать — не пользуйся Windows. Если кому то хочется использовать специфический формат даты — то пусть использует.
← →
ИМХО
(2004-02-13 17:13)
[4]
Блин, у меня сейчас так:
procedure TForm1.Button1Click(Sender: TObject);
var
Just_Date: TDateTime;
begin
ShortDateFormat := «dd.mm.yyyy»;
Just_Date := StrToDateTime(DateTimeToStr(Now));
end;
Усё равно ошибка:
«фев/13/04 17:11:33 is not a valid date and time»
← →
ИМХО
(2004-02-13 17:14)
[5]
Нет, теперь такая:
«13.02.2004 17:13:16 is not a valid date and time»
← →
Плохиш
(2004-02-13 17:24)
[6]
А если написать Just_Date := StrToDateTime(DateTimeToStr(Date));
?
← →
ИМХО
(2004-02-13 20:17)
[7]
Тогда:
«13.02.2004 is not a valid date and time»
← →
Zz_
(2004-02-13 20:24)
[8]
ShortTimeFormat
← →
DDA
(2004-02-13 20:32)
[9]
DateSeparator := «-«;
ShortDateFormat := «d/m/yyyy»;
Label1.Caption := DateToStr(Date);
Пример из Delphi