2012-04-12 12 views
13

Tengo datos de TimeSpan representados como formato de 24 horas, como 14:00:00, quiero convertirlo a formato de 12 horas, 2:00 PM, busqué en Google y encontré algo relacionado en stackoverflow y msdn, pero no lo hice Para resolver este problema, ¿alguien puede ayudarme? Gracias por adelantado.cómo convertir formato de 24 horas TimeSpan a formato de 12 horas TimeSpan?

actualización Parece que es posible convertir el formato TimeSpan 24 horas a String, pero imposible de convertir la cadena en formato de 12 horas TimeSpan :(

Pero todavía tiene buenas respuestas tantos, gracias !

+1

Puede proporcionar su código ... para comprender su problema .. – vikrantx

+0

No es muy claro, ¿puede elaborar un poco. El intervalo de tiempo no es absoluto, por lo que no puede representarlo en AM/PM. Entonces 14:00:00 no parece ser Timespan ¿es solo el tiempo almacenado en una variable de cadena en este formato? –

+0

Este [enlace] (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx) ayudará a – vikrantx

Respuesta

6

TimeSpan representa un intervalo de tiempo no un momento del día. La estructura DateTime es más probable que lo que estás buscando.

+1

En realidad," TimeSpan "es bastante adecuado para representar una hora del día, siempre y cuando se asegure de que" TotalDays <1 ". Las sobrecargas del operador le permiten calcular fácilmente cosas como el 'DateTime' para un evento en una fecha específica y un' TimeSpan' dado que representa una hora del día. Además 'DateTime.TimeOfDay' devolverá un' TimeSpan'. –

+0

Sin embargo, muchos puntos buenos requieren un ligero cambio en la forma de pensar acerca de cómo se representa el tiempo. Es confuso pensar que el tipo 'DateTime' que vuelve a representar una hora del día podría tener un valor que en realidad abarque _múltiples días_ (aunque lógicamente nunca lo haría). –

1

Suponiendo que usted es st aying en un rango de 24 horas, se puede lograr lo que quiere restando el TimeSpan negativa de hoy DateTime (o cualquier fecha para el caso), entonces tira de la parte de fecha:

DateTime dt = DateTime.Today; 
dt.Subtract(-TimeSpan.FromHours(14)).ToShortTimeString(); 

Rendimiento:

2 : 00 PM

5

TimeSpan representa un intervalo de tiempo (una diferencia entre los tiempos), no es una fecha o una hora, por lo que tiene poco sentido definirlo en formato de 24 o 12h. Supongo que realmente quiere un DateTime.

Por ejemplo 14:00 de hoy:

TimeSpan ts = TimeSpan.FromHours(14); 
DateTime dt = DateTime.Today.Add(ts); 

A continuación, puede dar formato a esa fecha como desee:

String formatted = String.Format("{0:d/M/yyyy hh:mm:ss}", dt); // "12.4.1012 02:00:00" - german (de-DE) 

http://msdn.microsoft.com/en-us/library/az4se3k1%28v=vs.100%29.aspx

6

es necesario convertir el TimeSpan a un objeto DateTime primero, luego use lo que DateTime format necesite:

var t = DateTime.Now.TimeOfDay; 

Console.WriteLine(new DateTime(t.Ticks).ToString("hh:mm:ss tt")); 

ToShortTimeString() también funcionaría, pero depende de la configuración regional para que no se muestre correctamente (o correctamente, según cómo lo vea) en sistemas que no sean de EE. UU.

+1

Debe especificar un 'CultureInfo' como' CultureInfo.InvariantCulture' en la llamada 'ToString' para evitar problemas cuando la cultura actual usa un formato de hora de 24 horas (en ese caso, el especificador de formato' tt' inserta una cadena vacía). –

1
String formatted = yourDateTimeValue.ToString("hh:mm:ss tt"); 
3

Pruebe este código:

int timezone = 0; 

Esta cadena da 12 horas formato

string time = DateTime.Now.AddHours(-timezone).ToString("hh:mm:ss tt"); 

Esta cadena da formato de 24 horas

string time = DateTime.Now.AddHours(-timezone).ToString("HH:mm:ss tt"); 
22

(Resumiendo mi comentarios dispersos en una sola respuesta.)

Primero debe comprender que TimeSpan representa un intervalo de tiempo. Este intervalo de tiempo se representa internamente como un recuento de ticks y no de la cadena 14:00:00 ni de la cadena 2:00 PM.Solo cuando convierte el TimeSpan en una cadena, tiene sentido hablar sobre las dos representaciones de cadena diferentes. El cambio de una representación a otra no altera ni convierte el conteo de ticks almacenado en el TimeSpan.

Tiempo de escritura como 2:00 PM en lugar de 14:00:00 es sobre el formato de fecha/hora y la cultura. Todo esto es manejado por la clase DateTime. Sin embargo, aunque TimeSpan representa un intervalo de tiempo, es bastante adecuado para representar la hora del día (DateTime.TimeOfDay devuelve TimeSpan). Entonces no es irrazonable usarlo para ese propósito.

Para realizar el formateo descrito, necesita confiar en la lógica de formato DateTime o simplemente crear su propio código de formato.

  • Usando DateTime:

    var dateTime = new DateTime(timeSpan.Ticks); // Date part is 01-01-0001 
    var formattedTime = dateTime.ToString("h:mm tt", CultureInfo.InvariantCulture); 
    

    Los especificadores de formato utilizando en ToString están documentados en la página Custom Date and Time Format Strings en MSDN. Es importante especificar un CultureInfo que utilice el designador AM/PM deseado. De lo contrario, el especificador de formato tt se puede reemplazar por la cadena vacía.

  • Uso de formato personalizado:

    var hours = timeSpan.Hours; 
    var minutes = timeSpan.Minutes; 
    var amPmDesignator = "AM"; 
    if (hours == 0) 
        hours = 12; 
    else if (hours == 12) 
        amPmDesignator = "PM"; 
    else if (hours > 12) { 
        hours -= 12; 
        amPmDesignator = "PM"; 
    } 
    var formattedTime = 
        String.Format("{0}:{1:00} {2}", hours, minutes, amPmDesignator); 
    

    cierto que esta solución es un poco más complejo que el primer método.

+0

wow ... respuesta tan detallada, 2 soluciones y tutorial de formato personalizado en MSDN ... ¡muchas gracias! – user1108069

+0

Esta solución me ayudó lo mejor. Mi variable formatTime se veía así: 'var formattedTime = String.Format (" {0} {1} ", hours, amPmDesignator);' –

Cuestiones relacionadas