Объявите TDateTime как константу в Delphi

Оказывается, у меня была ошибка

Выйти Код:

public async Task<ActionResult> LogOut()
{         
     await HttpContext.SignOutAsync("Cookies");
     await HttpContext.SignOutAsync("oidc");    
     return RedirectToAction("Index");
}

Изменено на:

public IActionResult Logout()
{
    return new SignOutResult(new[] { "Cookies", "oidc" });
}
29
задан Wouter van Nifterick 15 May 2009 в 17:16
поделиться

8 ответов

Хорошо, моя реакция немного запоздала, но вот решение для более нового Delphi.

Он использует неявные перегрузчики классов, так что записи этого типа могут использоваться, как если бы они были TDateTime переменные.

  TDateRec = record
    year,month,day,hour,minute,second,millisecond:word;
    class operator implicit(aDateRec:TDateRec):TDateTime;
    class operator implicit(aDateTime:TDateTime):TDateRec; // not needed
    class operator implicit(aDateRec:TDateRec):String; // not needed
    class operator implicit(aDateRec:String):TDateRec; // not needed
  end;

Реализация:

uses DateUtils;

class operator TDateRec.Implicit(aDateRec:TDateRec):TDateTime;
begin
  with aDateRec do // Yeah that's right you wankers. I like "with" :)
    Result := encodeDateTime(Year,Month,Day,Hour,Minute,Second,Millisecond);
end;

class operator TDateRec.Implicit(aDateTime:TDateTime):TDateRec;
begin
  with Result do
    DecodeDateTime(aDateTime,Year,Month,Day,Hour,Minute,Second,Millisecond);
end;

class operator TDateRec.Implicit(aDateRec:TDateRec):String;
begin
  Result := DateTimeToStr(aDateRec)
end;

class operator TDateRec.Implicit(aDateRec:String):TDateRec;
begin
  Result := StrToDateTime(aDateRec)
end;

Теперь вы можете объявить свои даты следующим образом:

const
  Date1:TDateRec=(Year:2009;month:05;day:11);
  Date2:TDateRec=(Year:2009;month:05;day:11;hour:05);
  Date3:TDateRec=(Year:2009;month:05;day:11;hour:05;minute:00);

Чтобы проверить, работает ли это, выполните следующее:

ShowMessage(Date1); // it can act like a string
ShowMessage(DateToStr(Date1)); // it can act like a date

Если вы действительно хотите заменить все свои переменные TdateTime этим, вам, вероятно, потребуется перегружают и некоторые другие операторы (сложение, вычитание, явное, ...).

22
ответ дан 28 November 2019 в 01:08
поделиться

Единственное? возможный путь, но вероятно не, что Вы ищете:

const
{$J+}
  Expire: TDateTime = 0;
{$J-}

initialization
  Expire := EncodeDate(2009, 3, 23);
12
ответ дан Jim McKeeth 28 November 2019 в 01:08
поделиться

Нет никакого способа сделать это, потому что интерпретация побережья даты сам по себе не детерминирована, она зависит от конвенции/локали, за которой Вы следуете.
'1/4/2009' не находится в январе ни для какого французского человека, например, и наличия компилятора, переводящего, поскольку 4-го января сделал бы это компилятором дурака ;-)
Если компилятор не реализует некоторых (хорошо зарегистрированный) "волшебная" биективная функция для соединения значения даты и представления дисплея... И так или иначе, половина планеты не хотела бы его.
Единственное не неоднозначный способ, которым я вижу теперь, состоит в том, чтобы обеспечить значение, даже если это похоже на боль...... мои 0,02$

8
ответ дан François 28 November 2019 в 01:08
поделиться

Нет, Delphi не поддерживает это.

Ваша первая идея была бы запросом на литералы даты и времени, отличные от обычных литералов с плавающей точкой. Я нашел королевского адвоката 72000, который является об отображенииTDateTime значения как даты в отладчике, но ничем о Вашем конкретном запросе. Это не похоже ничей никогда упомянуто это прежде, все же. Это - постоянная тема на группах новостей; я просто ничего не могу найти в королевском адвокате об этом.

Ваша вторая идея потребовала бы StrToDate быть evaluable во время компиляции. Я не вижу записей в королевском адвокате об этом также, но если это имеет значение, C++ получает такую функцию функций, которые, как показывают, имеют необходимые качества. StrToDate не отвечал бы тем требованиям, тем не менее, потому что это чувствительно к настройкам даты текущей локали.

6
ответ дан Rob Kennedy 28 November 2019 в 01:08
поделиться

Ответ Rob Kennedy показывает, что решение StrToDate по сути вне рассмотрения, поскольку Вы не хотите, чтобы Ваш код повредился, если это компилируется в Европе!

Я действительно соглашаюсь, что должен быть некоторый способ сделать EncodeDate, но нет.

Что касается меня компилятор должен просто скомпилировать и выполнить любой код, который он находит в постоянном присвоении, и сохраните результат в константу. Я оставил бы его до программиста, чтобы гарантировать, что код не чувствителен к, он - среда.

4
ответ дан Loren Pechtel 28 November 2019 в 01:08
поделиться

Одно решение состояло бы в том, чтобы создать список констант в течение многих лет, другого для смещений месяца и затем создать его на лету. Необходимо было бы заботиться о високосных годах сами путем добавления 1 к каждой получающейся константе. Только некоторые ниже для запущения Вас... :)

Const
  Leap_Day = 1;  // use for clarity for leap year dates beyond feb 29.
  Year_2009 = 39812;  // January 1, 2009
  Year_2010 = Year_2009 + 365; // January 1, 2010
  Year_2011 = Year_2010 + 365; // January 1, 2011
  Year_2012 = Year_2011 + 365; // January 1, 2012 (is leap year)
  Year_2013 = Year_2012 + Leap_Day + 365;  // January 1, 2013

Const
  Month_Jan = -1; // because adding the day will make the offset 0. 
  Month_Feb = Month_Jan + 31; // 31 days more for the first day of Feb.
  Month_Mar = Month_Feb + 28; // 28 days more for the first day of Mar.  
  Month_Apr = Month_Mar + 30; // 30 days more for the first day of Apr.

Const
  Expire_Jan1 : tDateTime = Year_2009 + Month_Jan + 1;
  Expire : tDateTime = Year_2009 + Month_Mar + 23;

Если у Вас есть високосный год затем, необходимо добавить 1 к чему-либо вне февраля того года.

Const
  Expire : tDateTime = Year_2008 + Month_Mar + 23 + Leap_Day;

Править

Добавленный еще несколько лет для ясности, и добавил константу Leap_Day.

4
ответ дан skamradt 28 November 2019 в 01:08
поделиться

Дата Delphi является # дней с 30 декабря 1899. Таким образом, Вы могли, вероятно, придумать тщательно продуманную математическую формулу для выражения даты как константы. Затем Вы могли отформатировать его очень странно, для подчеркивания человекочитаемых частей. Моя лучшая попытка ниже, но это очень неполно; с одной стороны, это предполагает, что все месяцы имеют 30 дней.

Мой пример главным образом для забавы все же. На практике это довольно смешно.

const
  MyDate = ((
           2009  //YEAR
                                          - 1900) * 365.25) + ((
           3     //MONTH
                                          - 1) * 30) +
           24    //DAY
           ;
3
ответ дан JosephStyons 28 November 2019 в 01:08
поделиться

i think the best solution available to you is to declare:

ArmisticeDay: TDateTime = 6888.0 + (11.0/24.0); //Nov 11, 1918 11 AM

and just accept it.


My attempt Nº1

Expire = EncodeDate(2009, 3, 23);

[Error] Constant expression expected

My attempt Nº2

Expire: TDateTime = EncodeDate(2009, 3, 23);

[Error] Constant expression expected

So even though they're constant, and deterministic (i.e. do not depend on any locale information), it still doesn't work.

1
ответ дан 28 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: