Convierta el valor del intervalo de tiempo al formato "hh: mm Am / Pm" usando C #

82

Tengo un valor almacenado en una variable de tipo de la System.TimeSpansiguiente manera.

System.TimeSpan storedTime = 03:00:00;

¿Puedo volver a almacenarlo en otra variable del tipo Stringsiguiente?

String displayValue = "03:00 AM";

Y si la storedTimevariable tiene el valor de

storedTime = 16:00:00;

entonces debería convertirse a:

String displayValue = "04:00 PM";
Amit Kumar
fuente

Respuestas:

191

Puede hacer esto agregando su intervalo de tiempo a la fecha.

TimeSpan timespan = new TimeSpan(03,00,00);
DateTime time = DateTime.Today.Add(timespan);
string displayTime = time.ToString("hh:mm tt"); // It will give "03:00 AM"
Asif Mushtaq
fuente
¿Es posible agregar una hora predeterminada desde este selector de fechas de arranque, por ejemplo datepicker value + TimeofDay:?
Shaiju T
1
Tenga en cuenta que esto siempre dará la hora del reloj de 12 horas con un prefijo AM / PM. Si desea que el resultado siga una cultura determinada, puede utilizar ShortTimePatternen su lugar:string displayTime = time.ToString("t" [, culture]);
Sphinxxx
1
O simplemente puede llamartime.ToShortTimeString()
Mardok
time.ToShortTimeString () no mantiene el 0 anterior a las 03:00 PM. time.ToString ("hh: mm tt") se encarga de ello
Souvik Basu
Quiero TimeSpan sin ninguna fecha, tal vez no importa, pero enlazas la fecha de hoy y no es apropiado, usando like string.Format (@ "{0: hh \: mm \: ss}", timespan) es mejor pero no No sé cómo agregar AM / PM a eso :(
QMaster
13

Muy simple usando el formato de cadena

en .ToSTring("") :

  • si usa "hh" - >> La hora, usando un reloj de 12 horas de 01 a 12.

  • si usa "HH" - >> La hora, usando un reloj de 24 horas de 00 a 23.

  • si agrega "tt" - >> El designador Am / Pm.

ejemplo de conversión de 23:12 a 11:12 pm:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("hh:mm tt");   // this show  11:12 Pm
var res2 = d.ToString("HH:mm");  // this show  23:12

Console.WriteLine(res);
Console.WriteLine(res2);

Console.Read();

espere un segundo que no es todo lo que necesita para preocuparse por otra cosa es el sistema Cultura porque el mismo código ejecutado en Windows con otro idioma, especialmente con diferentes idiomas culturales, generará un resultado diferente con el mismo código

Un ejemplo de ventanas configuradas para la cultura del idioma árabe se mostrará así:

// 23:12 م

م significa Tarde (primera letra de مساء).

en otra cultura del sistema dependerá de lo que esté configurado en la opción regional y de idioma de Windows, se mostrará // 23:12 du.

puede cambiar entre diferentes formatos en el panel de control de Windows en Windows regional e idioma -> formato actual (cuadro combinado) y cambiar ... aplicarlo hacer una reconstrucción (ejecutar) de su aplicación y ver de qué está hablando iam.

Entonces, ¿a quién puedo obligar a mostrar las palabras Am y Pm en un evento en inglés si la cultura del sistema actual no está configurada en inglés?

fácil con solo agregar dos líneas: ->

el primer paso agrega using System.Globalization;encima de tu código

y modificando el código anterior para que sea así:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.InvariantCulture); // this show  11:12 Pm

InvariantCulture => usando el formato de inglés predeterminado.

otra pregunta Quiero que el pm esté en árabe o en un idioma específico, incluso si uso Windows configurado en formato regional en inglés (u otro idioma).

Soution para el ejemplo árabe:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.CreateSpecificCulture("ar-AE")); 

esto mostrará // 23:12 م

evento si mi sistema está configurado en un formato de región en inglés. puede cambiar "ar-AE" si desea otro formato de idioma. hay una lista de cada idioma y su formato.

ejemplos: ar ar-SA árabe ar-BH ar-BH árabe (Bahréin) ar-DZ ar-DZ árabe (Argelia) ar-EG ar-EG árabe (Egipto)

Bilal
fuente
5
La pregunta sobre TimeSpan. Esta respuesta es para DateTime.
thelem
11

Puede agregar el TimeSpana DateTime, por ejemplo:

TimeSpan span = TimeSpan.FromHours(16);
DateTime time = DateTime.Today + span;
String result = time.ToString("hh:mm tt");

Demostración: http://ideone.com/veJ6tT

04:00 PM

Cadenas de formato de fecha y hora estándar

Tim Schmelter
fuente
gracias, después de horas lo intenté 11:57 pmy funcionó: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
Shaiju T
10
string displayValue="03:00 AM";

Este es un punto en el tiempo , no una duración (TimeSpan).

Entonces, algo está mal con su diseño básico o suposiciones.

Si desea usarlo, primero deberá convertirlo a un DateTime (punto en el tiempo). Puede formatear un DateTime sin la parte de la fecha, esa sería su cadena deseada.

TimeSpan t1 = ...;
DateTime d1 = DateTime.Today + t1;               // any date will do
string result = d1.ToString("hh:mm:ss tt");

La variable storeTime puede tener un valor como
storeTime=16:00:00;

No, puede tener un valor de 4 en punto pero la representación es binaria, un TimeSpan no puede registrar la diferencia entre 16:00y 4 pm.

Henk Holterman
fuente
11
Es lamentable que DateTime.TimeOfDaydevuelva un TimeSpan- Microsoft lo lleva a este diseño :(
Jon Skeet
2
@JonSkeet No sé si es el peor diseño (y sé que eres un torpe al respecto, respetuosamente, dado tu trabajo en Noda), es una cuestión de comprender las limitaciones de la interpretación. No existe el concepto de un familiar DateTime, si lo hubiera, entonces esto ("03:00 AM") sería simplemente una instancia de eso. Sin embargo, puedo ver que para la mayoría de los casos de uso, ese diseño (un pariente DateTime) complicaría demasiado los problemas (por supuesto, esto es a expensas de hacerlo más complicado para hacer un trabajo muy específico alrededor de fechas, horas, absolutas o no). , zonas horarias, etc.)
casperOne
7
@casperOne: Básicamente, está usando un tipo para representar información que lógicamente se almacenaría en un tipo diferente, solo porque si entrecierra los ojos lo suficiente, se ven similares. No sugeriría sobrecargar el significado de DateTimeaún más (ya es suficientemente malo). Debería haber un tipo que represente una "hora del día", que es, por supuesto, exactamente lo que he implementado en Noda Time. Siempre que intente agrupar muchos conceptos diferentes en una pequeña cantidad de tipos, seguramente tendrá problemas como este.
Jon Skeet
1
Esta respuesta es excelente porque explica por qué TimeSpan se comporta de la manera en que lo hace, en lugar de simplemente cómo solucionar el problema. Realmente debe haber tres tipos: DateTime, TimeOfDayy Date.
thelem
03:00 AMno es un "punto en el tiempo". Es un "punto en un día".
Alex
10

Aprovechando las respuestas existentes aquí:

public static string ToShortTimeSafe(this TimeSpan timeSpan)
{
    return new DateTime().Add(timeSpan).ToShortTimeString();
} 

public static string ToShortTimeSafe(this TimeSpan? timeSpan)
{
    return timeSpan == null ? string.Empty : timeSpan.Value.ToShortTimeSafe();
}
Chris Marisic
fuente
3
Esta es la respuesta más sensata
toddmo
9

Necesitará obtener un DateTimeobjeto de suTimeSpan y luego podrá formatearlo fácilmente.

Una posible solución es agregar el intervalo de tiempo a cualquier fecha con valor de tiempo cero.

var timespan = new TimeSpan(3, 0, 0);
var output = new DateTime().Add(timespan).ToString("hh:mm tt");

El valor de salida será "03:00 AM"(para la configuración regional en inglés).

Michal Klouda
fuente
6

No puede agregar AM / PM a un TimeSpan. De todos modos, tendrá que asociar el TimaSpanvalor con DateTimesi desea mostrar la hora en formato de reloj de 12 horas.

TimeSpanno está diseñado para usarse con un formato de reloj de 12 horas, porque aquí estamos hablando de un intervalo de tiempo .

Como dice la documentación ;

Un TimeSpanobjeto representa un intervalo de tiempo (duración o tiempo transcurrido) que se mide como un número positivo o negativo de días, horas, minutos, segundos y fracciones de segundo. La TimeSpanestructura también se puede usar para representar la hora del día, pero solo si la hora no está relacionada con una fecha en particular. De lo contrario, el DateTimeoDateTimeOffset debe utilizar la estructura su lugar.

También Microsoft Docs describe lo siguiente;

Un TimeSpanvalor se puede representar como [-]d.hh:mm:ss.ff, donde el signo menos opcional indica un intervalo de tiempo negativo, el dcomponente son días, hhson horas medidas en un reloj de 24 horas , mmson minutos, ssson segundos y ffson fracciones de segundo.

Entonces, en este caso, puede mostrar usando AM / PM de la siguiente manera.

TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");


Nota
al margen : también debe tener en cuenta que la propiedad TimeOfDay de DateTimees a TimeSpan, donde representa

un intervalo de tiempo que representa la fracción del día que ha transcurrido desde la medianoche.

Curiosidad
fuente
3

Analice el intervalo de tiempo en DateTime y luego use Format ("hh: mm: tt"). Por ejemplo.

TimeSpan ts = new TimeSpan(16, 00, 00);
DateTime dtTemp = DateTime.ParseExact(ts.ToString(), "HH:mm:ss", CultureInfo.InvariantCulture);
string str = dtTemp.ToString("hh:mm tt");

str estarán:

str = "04:00 PM"
Habib
fuente
2

Puedes probar esto:

   string timeexample= string.Format("{0:hh:mm:ss tt}", DateTime.Now);

puede eliminar hh o mm o ss o tt según sus necesidades, donde hh es la hora en formato de 12 horas, mm son minutos, ss son segundos y tt es AM / PM.

Ankit
fuente
1
Parse timespan to DateTime. For Example.    
//The time will be "8.30 AM" or "10.00 PM" or any time like this format.
    public TimeSpan GetTimeSpanValue(string displayValue) 
        {   
            DateTime dateTime = DateTime.Now;
                if (displayValue.StartsWith("10") || displayValue.StartsWith("11") || displayValue.StartsWith("12"))
                          dateTime = DateTime.ParseExact(displayValue, "hh:mm tt", CultureInfo.InvariantCulture);
                    else
                          dateTime = DateTime.ParseExact(displayValue, "h:mm tt", CultureInfo.InvariantCulture);
                    return dateTime.TimeOfDay;
                }
Nandha kumar
fuente
0

Al principio, debe convertir el intervalo de tiempo a la estructura DateTime:

var dt = new DateTime(2000, 12, 1, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds)

Luego debe convertir el valor en una cadena con formato de tiempo corto

var result = dt.ToString("t"); // Convert to string using Short Time format
STO
fuente