Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.25;
Скачать: CL | DM;

Вниз

Формат даты   Найти похожие ветки 

 
aglar ©   (2008-12-04 14:46) [0]

procedure TForm1.Timer1Timer(Sender: TObject);
var
 formatsettings: tFormatSettings;
begin
GetLocaleFormatSettings(1049, formatsettings);
statusbar1.Panels[1].Text:=DateTimetoStr(Now, formatsettings);
end;

Как вывести в статусбаре дату в полном формате?


 
clickmaker ©   (2008-12-04 14:48) [1]

FormatDateTime("dd.mm.yyyy hh:nn:ss"


 
{RASkov} ©   (2008-12-04 14:49) [2]

> [0] aglar ©   (04.12.08 14:46)

Достаточно Now и FormatDateTime()


 
aglar ©   (2008-12-04 15:41) [3]

сделал так

procedure TForm1.Timer1Timer(Sender: TObject);
var
 NowDate: TDateTime;
 formatsettings: Tformatsettings;
begin
NowDate:= Now;
GetLocaleFormatSettings(1049, formatsettings);
FormatDateTime("dd mmmm yyyy hh:nn:ss", NowDate, formatsettings);
statusbar1.Panels[1].Text:=DateTimetoStr(NowDate);
end;

не получилось - выводит дату в формате 04.12.2008 15.43.15


 
clickmaker ©   (2008-12-04 15:46) [4]

вообще-то, FormatDateTime - это функция...


 
aglar ©   (2008-12-04 15:49) [5]

Всем спасибо, работает так

procedure TForm1.Timer1Timer(Sender: TObject);
var
 NowDate: TDateTime;
 formatsettings: Tformatsettings;
 TimeString: string;
begin
NowDate:= Now;
GetLocaleFormatSettings(1049, formatsettings);
TimeString := FormatDateTime("dd mmmm yyyy hh:nn:ss", NowDate, formatsettings);
statusbar1.Panels[1].Text:= TimeString;
end;


 
Ega23 ©   (2008-12-04 16:08) [6]

procedure TForm1.Timer1Timer(Sender: TObject);
var
NowDate: TDateTime;
formatsettings: Tformatsettings;
TimeString: string;
begin
NowDate:= Now;
GetLocaleFormatSettings(1049, formatsettings);
TimeString := FormatDateTime("dd mmmm yyyy hh:nn:ss", NowDate, formatsettings);
statusbar1.Panels[1].Text:= TimeString;
end;


Достаточно одной строчки:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 statusbar1.Panels[1].Text:= FormatDateTime("dd.mm.yyyy hh:nn:ss", Now);
end;


 
Anatoly Podgoretsky ©   (2008-12-04 16:21) [7]

> Ega23  (04.12.2008 16:08:06)  [6]

Ему другой формат нужен и делает он правильно, а у тебя слишком упрощеный, не учитывающий современных реалий. Борланд на этом споткнулся еще раньше тебя и в Д7 рекомендует делать только так.


 
clickmaker ©   (2008-12-05 11:31) [8]

> слишком упрощеный, не учитывающий современных реалий. Борланд
> на этом споткнулся

это что за реалии? И на чем споткнулся Борланд?


 
Anatoly Podgoretsky ©   (2008-12-05 11:48) [9]

Современные реалии это многопоточные приложения и озабоченые программисты, которые меняют LocaleFormatSettings при том иногда на ходу, а стандартные переменные не потокобезопасные. Да чего рассказывать, в справке все написано.


 
clickmaker ©   (2008-12-05 12:00) [10]

> [9] Anatoly Podgoretsky ©   (05.12.08 11:48)

так у нас же там явно формат задан.
"dd.mm.yyyy hh:nn:ss"
как на эту строку могут повлиять "озабоченые программисты, которые меняют LocaleFormatSettings"?


 
Ega23 ©   (2008-12-05 12:04) [11]


> как на эту строку могут повлиять "озабоченые программисты,
>  которые меняют LocaleFormatSettings"?


Мне вот тоже это как-то непонятно...


 
clickmaker ©   (2008-12-05 12:25) [12]

ну разве что TimeSeparator ":" или если мы обобщенный формат зададим, типа "c"


 
Anatoly Podgoretsky ©   (2008-12-05 12:26) [13]

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

> TFormatSettings data structure must be initialized by a
> call to GetLocaleFormatSettings before it can be used with
> any string formatting routines.

Про ошибки Борланда конечно ничего, но в группах Борланда есть информация, может есть и в справке, но тогда хорошо спрятано.

Кроме того замечание касалось [6]
Ему не нужен формат dd.mm.yyyy - это не длинный формат даты, а короткий. А длинный формат от многого зависит, например
GetLocaleFormatSettings(1049, formatsettings);
первый параметр, кроме ранее сказаного выбирает какую локаль использовать.

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


 
Anatoly Podgoretsky ©   (2008-12-05 13:21) [14]

> clickmaker  (05.12.2008 12:00:10)  [10]

Это только часть формата, определяющий порядок и количество букв, правильно делать по инструкции Борланда, а именно вызывать GetLocaleSettings


 
Ega23 ©   (2008-12-05 13:47) [15]


> Anatoly Podgoretsky ©   (05.12.08 12:26) [13]


Интересно. Не знал. Буду иметь ввиду, спасибо.

Но всё равно (ИМХО), в статус-баре видеть строку "1 января 2008" - лично меня как-то коробит от этого.


 
Anatoly Podgoretsky ©   (2008-12-05 13:55) [16]

> Ega23  (05.12.2008 13:47:15)  [15]

Вероятнее будет "1 январь 2008"


 
clickmaker ©   (2008-12-05 13:57) [17]

> Вероятнее будет "1 январь 2008"

если озабоченный программист не сменит окончания в LongMonthNames )


 
Anatoly Podgoretsky ©   (2008-12-05 14:02) [18]

> clickmaker  (05.12.2008 13:57:17)  [17]

Может и проблема появится в другом месте.


 
Ega23 ©   (2008-12-05 14:12) [19]


> Вероятнее будет "1 январь 2008"


Тем более. Нафиг оно такое нужно...


 
Anatoly Podgoretsky ©   (2008-12-05 15:11) [20]

> Ega23  (05.12.2008 14:12:19)  [19]

Это еще не все, запустит программу на машине с другой локализацией и получит "1 januabris 2008"


 
Ega23 ©   (2008-12-05 15:28) [21]


> Это еще не все, запустит программу на машине с другой локализацией
> и получит "1 januabris 2008"


Ну, полное обобщение делать - это тоже своего рода паранойя.


 
Anatoly Podgoretsky ©   (2008-12-05 15:47) [22]

> Ega23  (05.12.2008 15:28:21)  [21]

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


 
Ega23 ©   (2008-12-05 16:13) [23]


> Какое обобщение, если я заранее точно не знаю, где будет
> запущена программа с гарантией, что кто то не изменит локализацию.


Это у тебя. Я, например, знаю, что моя не будет запущена.


 
Anatoly Podgoretsky ©   (2008-12-05 16:19) [24]


> Это у тебя. Я, например, знаю, что моя не будет запущена.

Может, но только один раз.


 
aglar ©   (2008-12-05 16:47) [25]


> Это еще не все, запустит программу на машине с другой локализацией
> и получит "1 januabris 2008"


Разве то, что мы устанавливаем LCID в 1049 ( GetLocaleFormatSettings(1049, formatsettings) )не значит, что будут полученны именно "русские" настройки?


 
Anatoly Podgoretsky ©   (2008-12-05 17:03) [26]

> aglar  (05.12.2008 16:47:25)  [25]

Об этом уже была речь, но ты не хочешь смотреть с точки зрения пользователя, нахрена ему january 1, 2008?
Посмотри на иконку календаря и попробуй поменять локализацию.


 
ЮЮ ©   (2008-12-10 08:01) [27]

Кстати, тут как-то кто-приводил код как получить от винды декабря, а не Декабрь, а я своевременно не воспользовался :(

Может напомнит?


 
{RASkov} ©   (2008-12-10 10:42) [28]

function GetDate: string;
var
 st: TSystemTime;
 Date, FormatString: PChar;
 DateSize, FormatStringSize: integer;
begin
 Result := "";
 FormatStringSize := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, nil, 0);
 GetMem(FormatString, FormatStringSize * SizeOf(Char));
 GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, FormatString, FormatStringSize);
 GetLocalTime(st);
 DateSize := GetDateFormat(LOCALE_USER_DEFAULT, 0, nil, FormatString, nil, 0);
 GetMem(Date, DateSize * SizeOf(Char));
 GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, FormatString, Date, DateSize * SizeOf(Char));
 Result := Date;
 FreeMem(Date);
 FreeMem(FormatString);
end;

Помоему этот код приводил DVM


 
clickmaker ©   (2008-12-10 11:09) [29]

> как получить от винды декабря, а не Декабрь

To get the genitive form of the month name, call GetDateFormat with a date picture of ddMMMM and remove the two digits from the beginning of the returned string.
(c) MSDN



Страницы: 1 вся ветка

Текущий архив: 2009.01.25;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
15-1227424851
Астро
2008-11-23 10:20
2009.01.25
Поиск по массиву половинным делением и добавление элементов?


9-1112987903
POL
2005-04-08 23:18
2009.01.25
С модэлирую 3D модели типа бесплатно


15-1227912693
Petr V. Abramov
2008-11-29 01:51
2009.01.25
Гимн Российской Федерации в исполнении хора мальчиков...


15-1227947603
Slider007
2008-11-29 11:33
2009.01.25
С днем рождения ! 29 ноября 2008 суббота


15-1227684509
natashap
2008-11-26 10:28
2009.01.25
помогите начинающему разобраться с delphi