Форум: "Начинающим";
Текущий архив: 2009.01.25;
Скачать: [xml.tar.bz2];
ВнизФормат даты Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.007 c