Константа даты .NET (с глобализацией)
Вопрос
Кто-нибудь знает способ объявить константу даты, совместимую с международными датами?
Я пробовал:
' 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)
Решение
Если вы посмотрите на 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.Поскольку это количество тиков определяется во время компиляции, маловероятно, что какая-либо локализация вступит в игру, когда это значение инициализируется во время выполнения.Я предполагаю, что ошибка связана с какой-то другой обработкой даты в вашем коде, а не с инициализацией константы.
Другие советы
Согласно документации Microsoft,
«Вы должны заключить литерал даты в числовые знаки (# #).Необходимо указать значение даты в формате М/д/гггг, например #31.05.1993#.Это требование не зависит от вашего региона и настроек формата даты и времени вашего компьютера».
Вы хотите сказать, что это неправильно и на синтаксический анализ влияет текущая локаль?
Редактировать: Вы пробовали указать год из 4 цифр?
Если у вас есть данные в объектах 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!
Хорошо, я лучше понимаю, откуда вы..
Как насчет:
- Создайте статический метод, который возвращает константу даты.Это решает международную проблему, поскольку оно возвращается как конкретное значение DateTime.
- Теперь я помню необязательные параметры из времен работы с VB6, но не могли бы вы просто перегрузить метод?Если вы используете перегруженный метод без даты, просто вытащите его из статики?
РЕДАКТИРОВАТЬ: Если вы не понимаете, что я имею в виду, и вам нужен пример кода, просто прокомментируйте этот пост, и я добавлю его.
Хорошо, я не уверен, что вы пытаетесь сделать здесь:
- Код, который вы публикуете, НЕТ .NET, вы пытаетесь портировать?
- DateTime не может быть объявлен как константа.
- DateTime — это тип данных, поэтому после инициализации формат, из которого они были инициализированы, не имеет значения.
- Если вам нужно постоянное значение, просто создайте метод, который всегда будет возвращать одно и то же значение DateTime.
Например:
public static DateTime SadDayForAll()
{
return new DateTime(2001, 09, 11);
}
Обновлять
Откуда, черт возьми, ты все это берешь?!
- Там являются различия между C# и VB.NET, и здесь подчеркивается один из них.
- Дата это не Тип данных .NET - ДатаВремя является.
- Похоже, вы можете создавать константы DateTime в VB.NET, но есть ограничения.
- Этот метод был призван помочь вам, поскольку вы не можете создать константу из переменная (т.е.необязательный параметр).Это даже не имеет смысла.