quitar - datetime year c#
AnĂ¡lisis de DateTime en sistemas localizados (5)
Tenemos una aplicación web que produce informes. Los datos se toman de una base de datos.
Cuando ejecutamos la aplicación web en un sistema localizado, explota. Trazamos el problema en un DateTime.Parse (dateString); llamada.
Las fechas almacenadas en la base de datos dependen en cierta medida de la configuración regional de la máquina.
En un sistema en inglés, la fecha se almacena como MM / DD / YYYY (25/06/2009), lo cual es perfectamente normal.
En un sistema ruso, la fecha se almacena como MM.DD.YYYY (25/06/2009). Esto es extraño porque la configuración predeterminada (he marcado) para el formato de fecha corta en Russian Systems es dd.MM.aaaaa ... Así que debería ser 25.06.2009. No entiendo por qué aceptó el separador predeterminado (.) Pero no el formato de fecha predeterminado.
De todos modos, ¿cómo puedo analizar la cadena de fecha en un sistema localizado? Si uso el cultureinfo ruso, aún arrojaría un error ya que está esperando dd.MM.aaaaa.
¡Gracias!
Depende del RDBMS realmente. Vea si puede hacer que la base de datos almacene fechas en el cultivo invariante o en una cultura específica (no cambiante) que elija, luego proporcione el Esto ya no parece ser una opción, ya que no tienes control sobre el almacenamiento de las fechas. CultureInfo
adecuado al método DateTime.Parse()
.
Tendrá que ver si puede averiguar cómo está almacenando las fechas y actuar en consecuencia. Compruebe la configuración del sistema operativo en el sistema ruso; tal vez alguien lo cambió de los valores predeterminados y la base de datos está reaccionando en consecuencia? Si es así, probablemente puedas reaccionar de la misma manera.
De lo contrario, necesitará cierta correlación entre el sistema y la forma en que se almacenan las fechas. Si todos los sistemas rusos lo almacenan de la misma manera, puede activar la cultura actual y usar ParseExact
. Sin embargo, se siente como un hack, pero no estoy seguro de que tengas otra opción.
En la base de datos, si debe almacenarlo como texto, debe estandarizar el formato. Aún mejor, sin embargo, almacenarlo como datetime
y no hay nada que analizar, solo leerlo desde la base de datos como una fecha ...
Si tiene una cadena, use la cultura conocida (quizás la cultura invariante) al analizar:
DateTime when = DateTime.Parse(s, CultureInfo.InvariantCulture);
Para ser franco, necesitas:
- Conozca el formato esperado en la base de datos. Si es posible, conviértalo en un único formato estándar como una cadena, o preferiblemente un tipo de fecha / hora en la base de datos (que luego puede leer desde la base de datos como
DateTime
, sin que su código realice conversiones). - Utilice el formato esperado llamando a
DateTime.ParseExact
y especificando la cadena de formato explícitamente.
Parece que tu problema está relacionado con tu base de datos.
En Windows debe: - verificar la configuración regional de su fuente de datos, - su cadena de conexión a los datos, - o cambiar el idioma predeterminado para el usuario en el RDBMS.
Cada uno de estos podría garantizar que sus datos se devuelvan en el formato correcto.
Los detalles exactos de la solución dependen, por supuesto, de la base de datos con la que está hablando y del sistema operativo que está utilizando.
Nunca debe almacenar una cadena de fecha localizada en la base de datos.
Debe almacenar fechas en columnas de fecha y luego localizar los datos en el momento de mostrarlos.
1. Establezca la configuración regional de la interfaz de usuario de su sitio
Este ejemplo establece la lang de acuerdo con la ruta de solicitud, pero puede tener otro mecanismo.
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim lang As String
If HttpContext.Current.Request.Path.Contains("/en/") Then
lang = "en" ''english''
ElseIf HttpContext.Current.Request.Path.Contains("/pt/") Then
lang = "pt" ''portugues''
Else
lang = "es" ''español, the default for the site''
End If
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang)
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang)
End Sub
2. Obtenga las variables de entrada a la fecha
Obtener los datos de la entrada de texto es fácil, esto es un ejemplo, pero con un validador de fecha debería estar bien.
dim theDate as date
if IsDate( txtDate.text ) then
theDate = DateTime.Parse(txtDate.text)
else
''throw exception or something
end if
Editar
Como dices que no puedes cambiar la forma en que está almacenado, estás en un gran problema, a menos que tengas en el archivo db alguna forma de indicar el formato de la fecha. El problema no son los separadores, pero cuando encuentras una fecha como 6/3/2009, no sabes si es el 6 de marzo o el 3 de junio.