Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2018, 15:46   #11
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Код:
 Month: array [0..11] of TMonth = (
  (engMonth: 'January'; ruMonth: 'Январь'),
  (engMonth: 'February'; ruMonth: 'Февраль'),
  (engMonth: 'March'; ruMonth: 'Март'),
  (engMonth: 'April'; ruMonth: 'Апрель'),
  (engMonth: 'May'; ruMonth: 'Май'),
  (engMonth: 'June'; ruMonth: 'Июнь'),
  (engMonth: 'July'; ruMonth: 'Июль'),
  (engMonth: 'August'; ruMonth: 'Август'),
  (engMonth: 'September'; ruMonth: 'Сетябрь'),
  (engMonth: 'October'; ruMonth: 'Октябрь'),
  (engMonth: 'November'; ruMonth: 'Ноябрь'),
  (engMonth: 'December'; ruMonth: 'Декабрь'));
Опять привязка к глобальным настройкам?
Что будет если винда будет немецкая?

Я бы просто распарсил решуляркой и преобразовал в числа месяца.
Avazart вне форума Ответить с цитированием
Старый 11.03.2018, 16:25   #12
exyl
Пользователь
 
Регистрация: 15.11.2014
Сообщений: 75
По умолчанию

Да я не знаю, зачем там вообще названия месяцев на каком бы то ни было другом языке, потому что на входе идет строка только с английскими не зависимо от винды. А вот уже после StrToDateTime вывод может быть в любом удобном пользователю формате и с учетом региональных особенностей ОС.

Последний раз редактировалось exyl; 11.03.2018 в 16:33.
exyl вне форума Ответить с цитированием
Старый 11.03.2018, 17:41   #13
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Код:
uses
  //...
  System.RegularExpressions,
  System.DateUtils;

Код:
type
  MonthNames= array [0 .. 11] of string;

function ParseDateTime(ADataTimeStr:String): TDateTime; overload; inline;
function ParseDateTime(ADataTimeStr:String; AMonthNames:MonthNames):TDateTime;overload;
Код:
const
  EnglishMonthNames:MonthNames =
  ('January', 'February', 'March',
    'April', 'May', 'June',
    'July', 'August', 'September',
    'October','November', 'December');

Код:
function NumberOfMonth(AMonthName:String;
                       AMonthNames: MonthNames):Integer;
var
  i: Integer;
begin
   for i := Low(MonthNames) to High(AMonthNames) do
      if AMonthName= AMonthNames[i] then
      begin
         Result:= i+1;
         Exit();
      end;
   Result:= 0;
end;
Код:
function ParseDateTime(ADataTimeStr:String;
                       AMonthNames:MonthNames):TDateTime;
var
  M:  TMatch;
  MonthNumber: Integer;
begin
   M:= TRegEx.Match(ADataTimeStr,
                   // '4 March 2018 13:10'
                    '(\d{1,2}) (\w+) (\d{4}) (\d{2}):(\d{2})');
                   // 1-day  2-month 3-year  4-hour 5-minute
   if not M.Success then
      raise Exception.Create('Wrong Date Time String Format!');

   MonthNumber :=  NumberOfMonth(M.Groups.Item[2].Value,AMonthNames);
   if MonthNumber=0 then
      raise Exception.Create('Wrong Month Name!');

   Result := EncodeDateTime(
           StrToInt(M.Groups.Item[3].Value),  // 3-year
           MonthNumber,                       // 2-month
           StrToInt(M.Groups.Item[1].Value),  // 1-day
           StrToInt(M.Groups.Item[4].Value),  // 4-hour
           StrToInt(M.Groups.Item[5].Value),  // 5-minute
           0, // second
           0  // millisecond
           );
end;

Код:
function ParseDateTime(ADataTimeStr:String):TDateTime;
begin 
  Result:= ParseDateTime(ADataTimeStr,EnglishMonthNames);
end;

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  Str = '4 March 2018 13:10';
var
  DT: TDateTime;
begin

  DT := ParseDateTime(Str);
  Caption:= DateTimeToStr(DT);
end;

Последний раз редактировалось Avazart; 11.03.2018 в 18:04.
Avazart вне форума Ответить с цитированием
Старый 11.03.2018, 19:02   #14
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

У вас тоже привязка к глобальному массиву

Цитата:
const
EnglishMonthNames:MonthNames =
('January', 'February', 'March',
'April', 'May', 'June',
'July', 'August', 'September',
'October','November', 'December');
а если строка будет такой
Str = '4 Dezember 2018 13:10'; по немецки
сработает ли ваш код?

Последний раз редактировалось Aliens_wolfs; 11.03.2018 в 19:07.
Aliens_wolfs вне форума Ответить с цитированием
Старый 11.03.2018, 19:05   #15
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
если строка будет такой
Str = '4 Dezember 2018 13:10'; по немецки
Не будет, ибо я как понимаю она берется из интернета и другого источника, формат которого постоянен и не зависит от локальных настроек.

И даже если так произойдет, мой код куда легче будет расширить/модифицировать чем Ваш,
добавив другой массив с именами месяцев и передав в ф-цию вторым параметром.

Последний раз редактировалось Avazart; 11.03.2018 в 19:09.
Avazart вне форума Ответить с цитированием
Старый 11.03.2018, 19:09   #16
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вы по сути ничего нового не предложили)
Цитата:
И даже если так произойдет, мой код куда легче будет расширить/модифицировать чем Ваш.
Каждый хвалит свое)
И приведите пример для немецкой модификации)

В общем у него все равно идет по английски все месяца и для этого простой код пойдет.
Пусть сам решит что ему нужно)

Последний раз редактировалось Aliens_wolfs; 11.03.2018 в 19:23.
Aliens_wolfs вне форума Ответить с цитированием
Старый 11.03.2018, 19:15   #17
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Вы по сути ничего нового не предложили)
Регулярки, вместо плясок вокруг кривого StrToDateTime() и тупой подмены символов.

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
И приведите пример для немецкой модификации)
Код:
const
GermanMonthNames:MonthNames =
('Januar',
 Februar',

// ...
);

DT := ParseDateTime(Str,GermanMonthNames);

Последний раз редактировалось Avazart; 11.03.2018 в 19:20.
Avazart вне форума Ответить с цитированием
Старый 11.03.2018, 19:22   #18
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
GermanMonthNames
По поводу этого просветите)
Вы также берете из массива инфу)

Смотрите пост #3 там такой же массив который можно дополнить чем угодно и взять все тоже самое что и вы предложили,
а в посте #10 я просто для двух языков для удобства написал,

Последний раз редактировалось Aliens_wolfs; 11.03.2018 в 19:29.
Aliens_wolfs вне форума Ответить с цитированием
Старый 11.03.2018, 19:27   #19
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
По поводу этого просветите)
Вы также берете из массива инфу)
Да но я ее не зашиваю в реализацию, а передаю параметром.

Другому программисту достаточно объявить массив и передать его в мою ф-цию, без правки моего модуля.

Последний раз редактировалось Avazart; 11.03.2018 в 19:30.
Avazart вне форума Ответить с цитированием
Старый 11.03.2018, 19:38   #20
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Все зависит от массива, чем заполнишь для своих нужд то и поймаешь
Можно массив сделать и глобальным, это на свой вкус и удобства изменения в нем значений

Последний раз редактировалось Aliens_wolfs; 12.03.2018 в 08:04.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ввод строки в СС16 и перевод в СС10 и вывод введеной строки после перевода с СС10 alexey961 Помощь студентам 1 09.10.2013 10:00
Перевод строки Waqq Помощь студентам 0 25.09.2011 18:02
Перевод строки BaSoff Общие вопросы C/C++ 1 12.04.2010 18:58
string to TDateTime NieL Общие вопросы Delphi 2 30.03.2009 18:43
Variant в TDateTime SoLL Общие вопросы Delphi 2 13.02.2009 11:49