Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Преобразование дат


Автор: Serebah 9.2.2011, 16:07
Даты хранится в виде "января 2011, февраля 2011, марта 2011 и т.д."
Как ее можно преобразовать в 01.01.2011, 01.02.2011, 01.03.2011 и т.д.

Автор: CROTishka 9.2.2011, 16:31
где они хранятся? скуль, или просто текст? если просто текст, то в DateUtils нет ничего похожего, придётся  самому разбирать. 
и вообще, в чём проблема? это же всего пара строк!

Автор: Serebah 9.2.2011, 16:43
Даты хранятся в виде текста. То что писать нужно функцию самому, это я знаю. Только еще я новичек в программировании и сам не могу разобраться. Может подскажите в общих чертах хоть?

Автор: Данкинг 9.2.2011, 16:47
Код

function dater (sss:string):string;
 begin
  if pos('января',sss)<>0 then result:='01.01.2011';
  ...
end;

Автор: Serebah 9.2.2011, 16:56
Спасибо большое. А если года у меня могут быть разные как это отобразить?

Автор: CROTishka 9.2.2011, 16:57
не, я нагнал. в DateUtils действительно нет ничего подобного. 
но в SysUtils есть 
StrToDateTime 
и 
FormatDateTime
это то, что вас интересует.

Добавлено через 53 секунды
Цитата

Спасибо большое. А если года у меня могут быть разные как это отобразить? 

не слушайте его. пишите нормальный код.

Автор: Serebah 9.2.2011, 17:04
SysUtils не подходят.

FormatDateTime форматирует в январь, февраль и т.п.
А у меня января , февраля и т.п.

Автор: Данкинг 9.2.2011, 18:18
CROTishka, чем тебе моя эксклюзивная функция не нравится? smile Тем более, где в SysUtils всякие "января" конвертируются?

Автор: Frees 9.2.2011, 18:20
Код

ShowMessage(DateToStr(VarToDateTime('января 2011')))


есть ограничения, региональные стандарты должны быть русские..

Автор: Serebah 9.2.2011, 18:25
Данкинг, 

Я хочу сделать по эксклюзивной функции.
Только если у месяцов год разный, то как его тоже менять?

Автор: kami 9.2.2011, 20:30
Вариант "в лоб". Строка должна быть вида "<месяца> 2010". Ведущие пробелы, заглавные буквы, любые символы после "2010" не допускаются, ибо в приведенном варианте год высчитывается как "всё, что после пробела". Как решить - оставляю Вам в качестве домашнего задания. Подсказка №1 - функция AnsiLowerCase.

Код

const
  Months : array[1..12] of string = (
    'ÿíâàðÿ', 'ôåâðàëÿ', 'ìàðòà',
    'àïðåëÿ', 'ìàÿ', 'èþíÿ', 'èþëÿ',
    'àâãóñòà','ñåíòÿáðÿ','îêòÿáðÿ','íîÿáðÿ', 'äåêàáðÿ');
var
  SpacePos:integer;
  i:integer;
  sMonth:string;
  cMonth:Word;
  cYear:Word;
begin
  SpacePos:=Pos(' ', Edit1.Text);
  sMonth:=Copy(Edit1.Text, 1, SpacePos-1);
  cMonth:=0;
  for i:=Low(Months) to High(Months) do
    if sMonth = Months[i] then
      begin
        cMonth:=i;
        Break;
      end;
  cYear:=StrToInt(Copy(Edit1.Text, SpacePos+1, Length(Edit1.Text)));

  Result:=EncodeDate(cYear, cMonth, 1);


Добавлено через 3 минуты и 33 секунды
Лень править (кодировка не совпала), в массиве Months лежат 'января','февраля','марта'...

Автор: superVad 10.2.2011, 00:13
kami, когда копируешь переключись в винде на русскую раскладку.

Автор: northener 10.2.2011, 02:13
Цитата(kami @  9.2.2011,  20:30 Найти цитируемый пост)
Вариант "в лоб"

Точнее "лбом об пол". Без результата. smile
Цитата(kami @  9.2.2011,  20:30 Найти цитируемый пост)
Строка должна быть вида

Лучше всего, если строка имеет "стандартный" вид, который понятен процедурам Дельфи и Windows.

Добавлено через 11 минут и 21 секунду
Цитата(Serebah @  9.2.2011,  16:07 Найти цитируемый пост)
Даты хранится в виде "января 2011, февраля 2011, марта 2011 и т.д."
Как ее можно преобразовать в 01.01.2011, 01.02.2011, 01.03.2011 и т.д. 


В данном случае (и в подобных ему) не стоит искать "стандартных" решений. Нужно всегда находить собственное решение для конкретной задачи!

Автор: Poseidon 10.2.2011, 09:13
Цитата(Serebah @  9.2.2011,  16:07 Найти цитируемый пост)
Даты хранится в виде "января 2011, февраля 2011, марта 2011 и т.д."Как ее можно преобразовать в 01.01.2011, 01.02.2011, 01.03.2011 и т.д.

Ну, добавлю и я свои 5 копеек.

Код

d:= StrToDate(ReplaceString(sss, 'января ','01.01.', [rfReplaceAll, rfIgnoreCase]));

и таких 12 строк.

Автор: kami 10.2.2011, 13:27
Цитата(superVad @  10.2.2011,  00:13 Найти цитируемый пост)
когда копируешь переключись в винде на русскую раскладку.

не помогает :(

Цитата(northener @  10.2.2011,  02:13 Найти цитируемый пост)
Точнее "лбом об пол". Без результата.

Поясните. Где я не прав?
Цитата(northener @  10.2.2011,  02:13 Найти цитируемый пост)
Лучше всего, если строка имеет "стандартный" вид, который понятен процедурам Дельфи и Windows.

В условии задачи строка нестандартного вида. Не всегда бывает как лучше, иногда случается "должно быть так".

Автор: Frees 10.2.2011, 13:39
Цитата(northener @  10.2.2011,  05:13 Найти цитируемый пост)
Лучше всего, если строка имеет "стандартный" вид, который понятен процедурам Дельфи и Windows.

она и так стандартного вида VarToDateTime замечательно ее понимает.


Цитата(kami @  10.2.2011,  16:27 Найти цитируемый пост)
не помогает :(

при вставке тоже на русский переключай

Автор: Serebah 10.2.2011, 16:40
А какой uses использует Replace String?

Добавлено через 11 минут и 45 секунд
kami, Спасибо большое, Ваша функция работает просто отлично  smile  smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)