2011-03-06 22 views
7

Supongamos que un sello de tiempo (apenas tiempo o fecha y la hora) cuando el tiempo puede darse la vuelta hasta el día siguiente:veces análisis sintáctico por encima de 24 horas en C#

00:00:00 < - medianoche

01:00:00 < - 01 a.m.

23:00:00 < - 23:00

24:00:00 < - medianoche, día + 1

25:00:00 < - 1 de la mañana, día + 1

¿Cuál sería una manera de analizar fácilmente en un C# DateTime que se realice el traspaso al día siguiente? En otras palabras, "01:00:00" se convertiría en "0001-01-01 01:00:00" y "25:00:00" se convertiría en "0001-01-02 01:00:00".

EDIT:

Debo mencionar que esta falla estrepitosamente (es decir FormatException):

DateTime.ParseExact("0001-01-01 25:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); 
+2

Para aquellos que sienten curiosidad acerca de esta notación, a veces las autoridades de tránsito usan el día de funcionamiento después de medianoche. – MPelletier

+0

¿Cuál es la cadena * real * que debe analizar? No es 0001-01-01 25:00:00 Estoy seguro. –

+0

@HansPassant: No, es realmente "25:00:00". Acabo de poner la fecha en mi código de muestra para no convertirlo en predeterminado a la fecha actual. Lo siento si eso es confuso. – MPelletier

Respuesta

8

Como intenta representar un período de tiempo desde un punto arbitrario, en lugar de una fecha específica, ¿quizás sería mejor utilizar la clase ? Esto le permite establecer valores de más de 24 horas en el constructor, y se puede utilizar con objetos DateTime como este:

System.TimeSpan timestamp = new System.TimeSpan(25, 0, 0); 
System.DateTime parsedDateTime = new DateTime(0, 0, 0); 
parsedDateTime = parsedDateTime.Add(timestamp); 
Console.WriteLine(parsedDateTime.ToString("yyyy-MM-dd HH:mm:ss")); //Output as "0001-01-02 01:00:00" 

NOTA: Código no se ha probado.

EDIT: En términos de análisis de las cuerdas, no puedo pensar en ninguna objetos básicos .NET que analizar cadenas con valores superiores a 23 para la hora (ya que 25 es una hora no válida del día), pero suponiendo que el formato sea coherente, podría crear una rutina de análisis de cadenas muy simple (o incluso una expresión regular) para leer los valores individualmente y cargar el constructor manualmente.

+1

+1 TimeSpan: ni siquiera pensé en eso. –

+0

Haces un buen punto, realmente es el tiempo desde un punto arbitrario (por ejemplo, medianoche, pero cualquier día), por lo que TimeSpan es realmente apropiado. – MPelletier

1

Está especificando una fecha no válida. ¡Entonces no solo no puedes analizarlo, no puedes almacenarlo!

¿Qué tal un buen objeto TimeSpan en su lugar? (También tiene un método Parse()).

Como alternativa, utilice una función de tipo sscanf() como la de http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net para extraer cada número por separado. (Mejor si no tiene control sobre el formato de cadena que se lee.)

+0

El método TimeSpan.Parse arroja una excepción OverflowException al analizar "25:00:00". – MPelletier

+0

@MPelletier: vea el enlace que agregué a mi respuesta. Si el formato no es estándar y no puede cambiar eso, deberá extraer los valores por separado. –

2

Si usted tiene un valor DateTime existente puede agregar a, siempre se puede utilizar un intervalo de tiempo: (justo lo suficiente)

string dt = "25:00:00"; 
int hours = int.Parse(dt.Split(':')[0]); 
TimeSpan ts = TimeSpan.FromHours(hours); 

TimeSpan.Parse() no trabaja directamente en este caso, ya que se queja de la 25 en la notación de la hora.

1

Si desea codificar hacia fuera ... esto debería ser un punto de partida:

string dateString = "0001-01-01 25:00:00"; 
string[] parts = dateString.Split(' '); //now have '0001-01-01' and '25:00:00' 

string datePart = parts[0]; // '0001-01-01' 
string[] timeParts = parts[1].Split(':'); //now have '25', '00', and '00 

DateTime initialDate = DateTime.ParseExact(datePart, "yyyy-MM-dd", CultureInfo.InvariantCulture);//use the date as a starting point 

//use the add methods to get your desired datetime 
int hours = int.Parse(timeParts[0]); 
int minutes = int.Parse(timeParts[1]); 
int seconds = int.Parse(timeParts[2]); 

DateTime resultDate = initialDate.AddHours(hours) 
            .AddMinutes(minutes) 
            .AddSeconds(seconds); 

Por supuesto, se realiza hipótesis que la entrada tiene el formato correcto y es apta para su procesamiento, etc .. Además , definitivamente podría usar el intervalo de tiempo en lugar de los métodos de agregar individualmente para hora, minuto, segundo, ya que algunas otras respuestas son ...

Cuestiones relacionadas