Is not valid date and time ошибка

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's user avatar

Donal Fellows

132k18 gold badges147 silver badges214 bronze badges

asked Jul 25, 2010 at 19:26

steve0's user avatar

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

RRUZ's user avatar

RRUZRRUZ

135k20 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

Kromster's user avatar

KromsterKromster

7,1417 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 Venema's user avatar

Marjan VenemaMarjan Venema

19.1k6 gold badges65 silver badges79 bronze badges

Прошу прощения, я ошибся и ввёл всех в заблуждение. Ошибку выдавала не строка с FormatDateTime
а следующая за ней строка, (если я переставлял местами год и день):

StrToDateTime(s);

Вот именно обратное преобразование — из строки в DateTime — зависит от Windows, и я не понимаю как
уйти от этой зависимости.

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

А FormatSettings — я же его вроде использовал… Или как то неправильно?

Toad World® Forums

Loading

Toad World by Quest

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [с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

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    19.04.05, 19:43

      Member

      **

      Рейтинг (т): 0

      Когда пытаюсь выполнить такую команду strtodatetime(‘12.04.2005 21:12:56’);
      То появляется ошибка ‘12.04.2005 21:12:56’ is not a valid date and time. При этом у меня в операционной системе в региональных настройках стоят американские стандарты. Поэтому и ошибка, так как у них правильно будет 12/04/2005 и т.д.
      Как мне тогда преобразовывать строку в дату, если вдруг пользователь изменит в ОС региональные стандарты? Можно ли как то преобразовать формат даты?


      s-mike



      Сообщ.
      #2

      ,
      19.04.05, 20:02

        Цитата SkyLight @ 19.04.05, 19:43

        Можно ли как то преобразовать формат даты?

        Ну, только заменой определенных символов. А что дата у тебя в проге хранится в текстовом виде? Лучше ее хранить как целое число. Если не нужно учитывать время, то это просто операция округления значения типа TDateTime.

        Profi

        Shaggy



        Сообщ.
        #3

        ,
        19.04.05, 20:17

          Moderator

          *****

          Рейтинг (т): 130

          ExpandedWrap disabled

            function FormatDateTime(const Format: string; DateTime: TDateTime): string; overload;

            function FormatDateTime(const Format: string; DateTime: TDateTime; const FormatSettings: TFormatSettings): string;

          Master

          jack128



          Сообщ.
          #4

          ,
          19.04.05, 20:58

            Moderator

            ******

            Рейтинг (т): 181

            Scorpyему наоборот нужно..
            SkyLight либо как Майк говорит, либо временно менять глобальные переменные, определяющие фомат даты.

            ExpandedWrap disabled

              begin

                ShortDateFormat := ‘d».»MM».»yyyy’;

                DateSeparator := ‘.’;

                TimeSeparator := ‘:’;

                ShowMessage(DateToStr(StrToDate(‘12.04.2005 21:12:56’)));

              end;

            Master

            Chow



            Сообщ.
            #5

            ,
            20.04.05, 05:44

              В общем случае задача тяжело решима, см.: РАБОТА С ДАТАМИ И ВРЕМЕНЕМ

              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

              0 пользователей:

              • Предыдущая тема
              • Delphi: Общие вопросы
              • Следующая тема

              Рейтинг@Mail.ru

              [ Script execution time: 0,0254 ]   [ 16 queries used ]   [ Generated: 8.06.23, 23:27 GMT ]  

               
              ИМХО
               
              (2004-02-13 16:49)
              [0]

              Если в панели управления («Язык и стандарты») для краткого формата даты стоит «МММ/дд/гг» (фев/13/04), то функция StrToDateTime возвращает ошибку
              «фев/13/04 16:48:31 is not a valid date and time»

              Как решить эту проблему?

              [ Script execution time: 0,0254 ]   [ 16 queries used ]   [ Generated: 8.06.23, 23:27 GMT ]  

               
              ИМХО
               
              (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


              Понравилась статья? Поделить с друзьями:
            • Is not a valid integer value как исправить ошибку
            • Is not a valid database ошибка
            • Is not a function ошибка json
            • Is not a function javascript в чем ошибка
            • Is not a block device ошибка монтирования