2011-01-11 16 views
14

Cuando un usuario rellena un formulario, utiliza un menú desplegable para indicar a qué hora le gustaría programar la prueba. Este menú desplegable contiene todos los momentos del día en incrementos de 15 minutos en el formulario AM/PM de 12 horas. Entonces, por ejemplo, si el usuario selecciona 4:15 pm, el servidor envía la cadena "4:15 PM" al servidor web con el envío del formulario.¿Cómo convierto una cadena de tiempo de 12 horas en C# TimeSpan?

Necesito alguna forma de convertir esta cadena en un Timespan, así que puedo almacenarlo en el campo de tiempo de mi base de datos (con linq a sql).

¿Alguien sabe de una buena manera de convertir una cadena de tiempo AM/PM en un intervalo de tiempo?

Respuesta

38

Es probable que desee utilizar un DateTime en lugar de TimeSpan. Puede usar DateTime.ParseExact para analizar la cadena en un objeto DateTime.

string s = "4:15 PM"; 
DateTime t = DateTime.ParseExact(s, "h:mm tt", CultureInfo.InvariantCulture); 
//if you really need a TimeSpan this will get the time elapsed since midnight: 
TimeSpan ts = t.TimeOfDay; 
+7

Este ejemplo no funcionará realmente para una cadena como "11:00 PM". El formato "H" en mayúsculas indica un reloj de 24 horas. Usar una "h" minúscula corrige ese problema. –

+1

Ese es un detalle realmente importante. Confirmado y editado. –

+1

Esto funciona si la hora está en formato "h: mm tt", es decir, las 4.15 p. M., Pero no funciona cuando el tiempo está en formato "hh: mm tt", es decir, 12.45 p. M. ¿Hay un formato que funcione para ambos? – gurrawar

1

Probar:

string fromServer = <GETFROMSERVER>(); 
var time = DateTime.Parse(fromServer); 

que le consigue el tiempo, si se crea la hora de finalización, así que usted puede conseguir por lapsos hacer aritmética w/objetos DateTime.

3

Prueba esto:

DateTime time; 
if(DateTime.TryParse("4:15PM", out time)) { 
    // time.TimeOfDay will get the time 
} else { 
    // invalid time 
} 
7

forma más sencilla es la siguiente:

var time = "4:15 PM".ToTimeSpan(); 

.

Esto toma el código de Phil y lo pone en un método de ayuda. Es trivial, pero se convierte en una llamada de una línea:

public static class TimeSpanHelper 
{   
    public static TimeSpan ToTimeSpan(this string timeString) 
    { 
     var dt = DateTime.ParseExact(timeString, "h:mm tt", System.Globalization.CultureInfo.InvariantCulture);    
     return dt.TimeOfDay; 
    } 
} 
+0

La cadena de formato debe ser "h: mm tt" o si no hay espacio entre "AM/PM" y "h: mmtt". –

+0

@DanRandolph gracias por la sugerencia, he editado la solución como se mencionó. – Lee

2

me gusta la respuesta de Lee lo mejor, pero acermate sería correcto si desea utilizar TryParse. Para combinar eso y obtener el intervalo de tiempo, haga:

public TimeSpan GetTimeFromString(string timeString) 
    { 
     DateTime dateWithTime = DateTime.MinValue; 
     DateTime.TryParse(timeString, out dateWithTime); 
     return dateWithTime.TimeOfDay; 
    } 
Cuestiones relacionadas