.NET Date Const (с глобализацией) - PullRequest
       3

.NET Date Const (с глобализацией)

3 голосов
/ 12 сентября 2008

Кто-нибудь знает способ объявления константы даты, совместимой с международными датами?

Я пробовал:

' not international compatible
public const ADate as Date = #12/31/04#

' breaking change if you have an optional parameter that defaults to this value
' because it isnt constant.
public shared readonly ADate As New Date(12, 31, 04)

Ответы [ 5 ]

6 голосов
/ 12 сентября 2008

Если вы посмотрите на IL, сгенерированный оператором

public const ADate as Date = #12/31/04#

Вы увидите это:

.field public static initonly valuetype [mscorlib]System.DateTime ADate
.custom instance void [mscorlib]System.Runtime.CompilerServices.DateTimeConstantAttribute::.ctor(int64) = ( 01 00 00 C0 2F CE E2 BC C6 08 00 00 )

Обратите внимание, что DateTimeConstantAttribute инициализируется конструктором, который принимает число тиков int64. Поскольку этот счетчик тиков определяется во время компиляции, маловероятно, что какая-либо локализация вступает в игру, когда это значение инициализируется во время выполнения. Я предполагаю, что ошибка связана с другой обработкой даты в вашем коде, а не с константной инициализацией.

4 голосов
/ 12 сентября 2008

Согласно документации Microsoft,

"Вы должны заключить литерал Date в число знаков (# #). Вы должны указать значение даты в формате M / d / yyyy, например # 5/31/1993 #. Это требование не зависит от вашего языка и настройки формата даты и времени на вашем компьютере. "

Вы говорите, что это неправильно, и на синтаксический анализ влияет текущая локаль?

Редактировать: Вы пробовали с 4-значным годом?

1 голос
/ 12 сентября 2008

Если у вас есть данные в объектах Date в VB, вам не нужно беспокоиться о глобализации, пока вы не сравните что-то с этим или не попытаетесь экспортировать его.

Это нормально:

Dim FirstDate as Date = Date.UtcNow() 'or this: = NewDate (2008,09,10)'
Dim SecondDate as Date

SecondDate = FirstDate.AddDays(1)

Это извлекает правила глобализации и печатает в формате культуры текущего потока:

HeaderLabel.Text = SecondDate.ToString()

Это плохо:

Dim BadDate as Date = CDate("2/20/2000")

На самом деле - даже это нормально, если в этом случае вы заставляете CDate использовать правильную культуру (InvariantCulture):

Dim OkButBadPracticeDate as Date = CDate("2/20/2000", CultureInfo.InvariantCulture)

Если вы хотите принудить все к определенной культуре, вам нужно установить культуру выполнения потока и культуру пользовательского интерфейса на желаемую культуру (en-US, инвариант и т. Д.).

Убедитесь, что вы не выполняете работу с датами в виде строк - убедитесь, что они являются фактическими объектами Date!

0 голосов
/ 12 сентября 2008

Хорошо, хорошо, я больше понимаю, откуда ты.

Как насчет:

  • Создать статический метод, который возвращает константу даты. Это устраняет международную проблему, поскольку она возвращается как конкретное значение DateTime.
  • Теперь я помню дополнительные параметры из моих дней VB6, но разве вы не можете просто перегрузить метод? Если вы используете перегруженный метод без даты, просто вытяните его из статики?

РЕДАКТИРОВАТЬ: Если вы не уверены, что я имею в виду и хотите пример кода, просто прокомментируйте этот пост, и я добавлю один.

0 голосов
/ 12 сентября 2008

ОК, я не уверен, что вы пытаетесь сделать здесь:

  • Вы отправляете код НЕ .NET, вы пытаетесь портировать?
  • DateTime не может быть объявлен как константа.
  • DateTime - это тип данных, поэтому после инициализации формат, из которого они были инициированы, не имеет значения.
  • Если вам нужно постоянное значение, просто создайте метод, который всегда возвращает один и тот же DateTime.

Например:

public static DateTime SadDayForAll()
{
    return new DateTime(2001, 09, 11);
}

Обновление

Откуда, черт возьми, ты все это получаешь?!

  • * * * * * * * * * * * * * * * * * * * * * * *
  • Дата не является .NET типом данных - DateTime is.
  • Похоже, вы можете создавать константы DateTime в VB.NET, но есть ограничения
  • Метод был здесь, чтобы попытаться помочь вам, поскольку вы не можете создать const из переменной (то есть необязательного параметра). Это даже не имеет смысла.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...