Pregunta

¿Alguien conoce alguna forma de declarar una fecha constante que sea compatible con fechas internacionales?

He intentado:

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

Solución

Si nos fijamos en el IL generado por la declaración

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

Verás esto:

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

Note que el FechaHoraConstanteAtributo se está inicializando con un constructor que toma un recuento de ticks int64.Dado que este recuento de ticks se determina en el momento de la compilación, parece poco probable que entre en juego alguna localización cuando este valor se inicializa en el tiempo de ejecución.Supongo que el error se debe a algún otro manejo de fechas en su código, no a la inicialización constante.

Otros consejos

Según la documentación de Microsoft,

"Debe encerrar un literal de fecha entre signos numéricos (##).Debe especificar el valor de fecha en el formato M/d/yyyy, por ejemplo #5/31/1993#.Este requisito es independiente de su ubicación y de la configuración de formato de fecha y hora de su computadora".

¿Está diciendo que esto no es correcto y que el análisis se ve afectado por la configuración regional actual?

Editar: ¿Probaste con un año de 4 dígitos?

Una vez que tenga datos en objetos Date en VB, no tendrá que preocuparse por la globalización hasta que compare algo con ellos o intente exportarlo.

Esto esta bien:

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

SecondDate = FirstDate.AddDays(1)

Esto incorpora las reglas de globalización y las imprime en el formato cultural del hilo actual:

HeaderLabel.Text = SecondDate.ToString()

Esto es malo:

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

En realidad, incluso eso está bien si fuerza a CDate en ese caso a usar la cultura correcta (InvariantCulture):

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

Si desea forzar todo a una cultura en particular, debe configurar la cultura del subproceso de ejecución y la cultura de la interfaz de usuario en la cultura deseada (en-US, invariante, etc.).

Asegúrate de no trabajar con fechas como cadenas; ¡asegúrate de que sean objetos de fecha reales!

Ok, claro, entiendo mejor de dónde vienes.

Qué tal si:

  • Cree un método estático que devuelva la constante de fecha.Esto soluciona el problema internacional ya que se devuelve como el valor DateTime específico.
  • Ahora recuerdo los parámetros opcionales de mis días en VB6, pero ¿no puedes simplemente sobrecargar el método?Si está utilizando el método sobrecargado sin la fecha, ¿simplemente sáquelo del estático?

EDITAR: Si no está seguro de lo que quiero decir y desea un ejemplo de código, simplemente comente esta publicación y agregaré uno.

Bien, no estoy seguro de lo que estás intentando hacer aquí:

  • El código que estás publicando es NO .NET, ¿estás intentando realizar la portabilidad?
  • Los DateTime no se pueden declarar como constantes.
  • Los DateTime son un tipo de datos, por lo que una vez iniciados, el formato desde el que se iniciaron es irrelevante.
  • Si necesita un valor constante, simplemente cree un método para devolver siempre el mismo DateTime.

Por ejemplo:

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

Actualizar

¡¿De dónde diablos sacas todo eso?!

  • Allá son diferencias entre C# y VB.NET, y esto resalta una de ellas.
  • Fecha no es un tipo de datos .NET - Fecha y hora es.
  • Parece que puedes crear constantes DateTime en VB.NET pero existen limitaciones.
  • El método estaba ahí para intentar ayudarte, ya que no puedes crear una constante a partir de un variable (es decir.parámetro opcional).Eso ni siquiera tiene sentido.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top