Могу ли я получить DateTime, если месяц - это слово?

Я заполнил ComboBox месяцами и годами в формате:

August 2014
July 2014
June 2014

При выборе (скажем, июль 2014 г.) в идеале я хотел бы создать переменную DateTime в формате «07.01.14». Есть ли способ взять месяц, который в настоящее время является строкой, и преобразовать его в целое число?

Большое спасибо за ваше время.


person Jon K.    schedule 15.04.2015    source источник
comment
Да, есть способы сделать это   -  person David Heffernan    schedule 15.04.2015
comment
На данный момент я намерен разделить строку на пробел, чтобы дать мне «июль» и «2014», а затем перебирать LongMonthNames, пока не найду совпадение в месяце. Просто проверяю, есть ли более эффективный способ.   -  person Jon K.    schedule 15.04.2015
comment
Из того, что вы написали, похоже, что более эффективных способов нет. Трудно сказать, не видя фактического кода, заполняющего ваш ComboBox.   -  person Dalija Prasnikar    schedule 15.04.2015
comment
Indead вам нужно разделить эту строку и получить месяц в формате слова. Затем вы можете закодировать дату в формате TDateTime. Я предлагаю вам прочитать модуль System.DateUtils, он ОЧЕНЬ полезен, и вы раз и навсегда поймете, как работает TDateTime, а также узнаете много полезных функций даты и времени.   -  person oPsDCadarn    schedule 15.04.2015
comment
Вы можете использовать TDictionary‹String, Integer›. Эффективность - это вопрос мнения.   -  person LU RD    schedule 15.04.2015
comment
Сколько записей у вас есть в ComboBox? Все записи следуют друг за другом? Если они делают все, что вам нужно сделать, это выяснить, какая из них является первой записью, а затем использовать простую математику для декодирования остальных из индекса элемента. В каждом году 12 месяцев, поэтому, если первым элементом является январь 2014 года, вы можете извлечь год, просто разделив индекс на 12. И чтобы получить, какой месяц вы вычисляете результат модуля.   -  person SilverWarior    schedule 15.04.2015


Ответы (2)


Есть ли способ взять месяц, который в настоящее время является строкой, и преобразовать его в целое число?

Да. Перебрать возможные имена в поисках совпадения:

function GetMonthNumber(const fs: TFormatSettings; const Name: string): Integer;
begin
  for Result := Low(fs.LongMonthNames) to High(fs.LongMonthNames) do
    if SameText(Name, fs.LongMonthNames[Result]) then
      exit;
  Result := -1;
end;
person Zam    schedule 15.04.2015

Вот мой простой пример, как получить номер месяца.

const
 Month : array [1..12] of string = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

function TForm1.IndexOfMonth(s: string): integer;
var
  I: Integer;
begin
  result := -1;
  for I := 1 to 12 do
    begin
      if UpperCase(S) = UpperCase(Month[i]) then
       begin
         result := i;
         break;
       end;
    end;
end;

function TForm1.GetMonthFromCombo : integer;
var s : string;
begin
  s := Copy(ComboBox1.Text,1, Pos(' ', ComboBox1.Text)-1);
  result := IndexOfMonth(s);
end;
person Val Marinov    schedule 15.04.2015
comment
Некоторые проблемы с этим. Прежде всего, функция не должна быть методом формы. Это неправильный уровень для него. Во-вторых, функция не всегда устанавливает возвращаемое значение. В-третьих, вы повторяете названия месяцев, а не используете встроенные значения. В-четвертых, ваше сравнение чувствительно к регистру. Не очевидно, что ваш ответ добавляет к ответу, который написал Зам. - person David Heffernan; 15.04.2015
comment
Это всего лишь пример. Для этого неважно, метод это или функция. Вы правы в отношении учета регистра. Я также добавил возвращаемый результат. Что касается ответа Зама, я его не видел. мне жаль. - person Val Marinov; 15.04.2015
comment
Действительно имеет значение, является ли это методом формы или выставленным повторно используемым способом. Делая это методом формы, вы подаете пример разработчику, который явно все еще учится. Если разработчик последует вашему примеру, то он будет учиться плохой практике. - person David Heffernan; 15.04.2015