Вопрос

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

Я пробовал:

' 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, но есть ограничения.
  • Этот метод был призван помочь вам, поскольку вы не можете создать константу из переменная (т.е.необязательный параметр).Это даже не имеет смысла.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top