Pergunta

Alguém conhece uma maneira de declarar uma constante de data compatível com datas internacionais?

Eu tentei:

' 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)
Foi útil?

Solução

Se você olhar para o IL gerado pela declaração

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

Você verá isto:

.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 )

Observe que o Atributo DateTimeConstant está sendo inicializado com um construtor que utiliza uma contagem de ticks int64.Como essa contagem de ticks está sendo determinada em tempo de compilação, parece improvável que qualquer localização entre em ação quando esse valor for inicializado em tempo de execução.Meu palpite é que o erro está em algum outro tratamento de data em seu código, não na inicialização const.

Outras dicas

De acordo com a documentação da Microsoft,

"Você deve colocar um literal de data entre sinais numéricos (# #).Você deve especificar o valor da data no formato M/d/aaaa, por exemplo #31/05/1993#.Este requisito é independente da sua localidade e das configurações de formato de data e hora do seu computador."

Você está dizendo que isso não está correto e que a análise é afetada pela localidade atual?

Editar: Você tentou com um ano de 4 dígitos?

Depois de colocar os dados em objetos Date no VB, você não precisa se preocupar com a globalização até comparar algo com eles ou tentar exportá-los.

Isto é bom:

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

SecondDate = FirstDate.AddDays(1)

Isso extrai as regras de globalização e imprime no formato de cultura do thread atual:

HeaderLabel.Text = SecondDate.ToString()

Isto é mau:

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

Na verdade - até isso está OK se você forçar o CDate nesse caso a usar a cultura correta (InvariantCulture):

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

Se quiser forçar tudo para uma cultura específica, você precisa definir a cultura do thread de execução e a cultura da UI para a cultura desejada (en-US, invariante, etc.).

Certifique-se de não estar trabalhando com datas como strings - certifique-se de que sejam objetos Date reais!

Ok, certo, eu entendo mais de onde você vem ..

Que tal:

  • Crie um método estático que retorne a constante de data.Isso supera o problema internacional, pois é retornado como o valor DateTime específico.
  • Agora me lembro dos parâmetros opcionais dos meus dias de VB6, mas você não pode simplesmente sobrecarregar o método?Se você estiver usando o método sobrecarregado sem a data, basta retirá-lo do estático?

EDITAR: Se você não tem certeza do que quero dizer e gostaria de um exemplo de código, basta comentar esta postagem e eu lançarei um.

OK, não tenho certeza do que você está tentando fazer aqui:

  • O código que você está postando é NÃO .NET, você está tentando portar?
  • DateTime não pode ser declarado como constantes.
  • DateTime é um tipo de dados, portanto, uma vez iniciado, o formato a partir do qual foram iniciados é irrelevante.
  • Se precisar de um valor constante, basta criar um método para retornar sempre o mesmo DateTime.

Por exemplo:

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

Atualizar

De onde diabos você está tirando tudo isso?!

  • são diferenças entre C# e VB.NET, e isso destaca uma delas.
  • Data não é um Tipo de dados .NET - Data hora é.
  • Parece que você pode criar constantes DateTime em VB.NET, mas há limitações
  • O método estava lá para tentar ajudá-lo, já que você não pode criar um const a partir de um variável (ou seja,parâmetro opcional).Isso nem faz sentido.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top