¿Cómo obtengo el valor AM / PM de un DateTime?

204

El código en cuestión está abajo:

public static string ChangePersianDate(DateTime dateTime)
{
    System.Globalization.GregorianCalendar PC = new System.Globalization.GregorianCalendar();
    PC.CalendarType = System.Globalization.GregorianCalendarTypes.USEnglish;
    return
    PC.GetYear(dateTime).ToString()
    + "/"
    + PC.GetMonth(dateTime).ToString()
    + "/"
    + PC.GetDayOfMonth(dateTime).ToString()
    + ""
    + PC.GetHour(dateTime).ToString()
    + ":"
    + PC.GetMinute(dateTime).ToString()
    + ":"
    + PC.GetSecond(dateTime).ToString()
    + " "
    ????????????????
}

¿Cómo puedo obtener el AM / PM del dateTimevalor?

SilverLight
fuente
24
Hay formas mucho mejores de formatear un DateTimeque esto. Ver msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF
Solo usedateTime.ToString("tt");
David Jesus

Respuestas:

368

Qué tal si:

dateTime.ToString("tt", CultureInfo.InvariantCulture);
Andy
fuente
3
Debe agregar el nuevo System.Globalization.CultureInfo ("en-US") para hacerlo bien (si aún no está ejecutando el hilo en un contexto estadounidense)
Thomas
1
@thomas - Buen punto. Editado ahora para especificarCultureInfo.InvariantCulture
Andy
8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
IndieTech Solutions
Esto para obtener AM / PM desde la fecha. Pero si quiero cambiar de AM a PM en cualquier fecha. Entonces, qué debería hacer ?
Ajay Sharma
2
@AjaySharma Simplemente agregue 12 horas antes de la evaluación del formato. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM
107
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

Esto debería darte el valor de cadena de la hora. Debería adjuntarse am / pm.

También puede mirar el tema relacionado:

¿Cómo se obtiene la hora actual del día?

XikiryoX
fuente
8
Esto debería ser minúscula hhya que su representación actual sale en 24 horas con am y pm, lo cual es un poco inútil
no me
1
@LukeMcGregor He modificado la respuesta según su sugerencia.
Doctor Jones
46

El DateTimesiempre debe estar internamente en el calendario "americano" (gregoriano). Entonces si lo haces

var str = dateTime.ToString(@"yyyy/MM/dd hh:mm:ss tt", new CultureInfo("en-US"));

deberías obtener lo que quieres en muchas menos líneas.

xanatos
fuente
33

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, eso no es todo lo que necesita para preocuparse por otra cosa, es la cultura del sistema porque el mismo código ejecutado en ventanas con otro idioma especialmente con idioma de cultura diferente generará resultados diferentes con el mismo código

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

// 23:12 م

م significa Tarde (primer leter de مساء).

en otro sistema, la cultura dependerá de lo que esté configurado en la opción regional de Windows y el idioma, 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 haga una reconstrucción (ejecución) de su aplicación y vea de qué está hablando iam.

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

fácil simplemente agregando dos líneas: ->

el primer paso agregar using System.Globalization; encima de su 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 predeterminado en inglés.

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

Soción 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       Arabic
ar-BH       ar-BH       Arabic (Bahrain)
ar-DZ       ar-DZ       Arabic (Algeria)
ar-EG       ar-EG       Arabic (Egypt)

big list...

hazme saber si tienes otra pregunta.

Bilal
fuente
Si quiero ver "11:12 PM"? Creo que tu respuesta es incompleta.
Fjodr
18

Sé que esto podría parecer extremadamente tarde ... sin embargo, puede ayudar a alguien por ahí

Quería obtener la parte AM PM de la fecha, así que utilicé lo que Andy me aconsejó:

dateTime.ToString("tt");

Utilicé esa parte para construir una Ruta para guardar mis archivos. ¡Construí mis suposiciones de que obtendré AM o PM y nada más!

sin embargo, cuando utilicé una PC que su cultura no es el inglés ... (en mi caso ÁRABE) ... mi aplicación falló porque el formato "tt" devolvió algo nuevo, no AM ni PM (م o ص) ...

Entonces, la solución a esto fue ignorar la cultura agregando el segundo argumento de la siguiente manera:

dateTime.ToString("tt", CultureInfo.InvariantCulture);

.. por supuesto, debe agregar: using System.Globalization; encima de tu archivo espero que ayude a alguien :)

buscandoSO
fuente
3
Gracias por agregar esto, ya que me ayudó hoy: estaba recibiendo AM en mi entorno de desarrollo y AM en el servidor remoto y no había mucha ayuda de Google con él hasta que leí esta publicación. Incluso Dotnetpearls dice "No hay períodos en la salida de tt. Si necesita períodos en su AM o PM, tendría que manipular la cadena". Lo cual, por supuesto, era completamente falso en mi caso ...
KiwiSunGoddess
13

es bastante simple

  Date someDate = new DateTime();
  string timeOfDay = someDate.ToString("hh:mm tt"); 
  // hh - shows hour and mm - shows minute - tt - shows AM or PM
Jamisco
fuente
10
+ PC.GetHour(datetime) > 11 ? "pm" : "am"

Para su ejemplo, pero hay mejores formas de formatear fecha y hora.

Kevin Holditch
fuente
Vea el enlace que @ChrisF ha dado anteriormente. Básicamente, puede usar el método ToString en el objeto datetime y pasarle un formato. De esta manera no llama a datetime. ToString varias veces como lo hace en su ejemplo de código.
Kevin Holditch
2
Por feo que parezca, es una forma mucho más simple y más consistente que jugar con diferentes culturas. Por ejemplo, muchas culturas muestran la hora en 24 horas y no incluyen AM / PM en absoluto, y ToString ("tt") produce una cadena vacía.
nathanchere
4

Algo así como bool isPM = GetHour() > 11. Pero si desea formatear una fecha en una cadena, no debería necesitar hacerlo usted mismo. Utilice las funciones de formato de fecha para eso.

CodesInChaos
fuente
1
Honestamente, ni siquiera mostraría el método isPM (). La única forma de formatear legítimamente los objetos DateTime es usar los formateadores.
richb01
@ richb01 No estoy de acuerdo. La única forma segura es no usar am / pm en absoluto y usar el formato 24h, siempre agregue la cultura invariante o hacerlo manualmente. "am" y "pm" no se completan, por ejemplo, en idioma alemán, solo está vacío. Si alguien escribe String.Format ("{0: hh: mm tt}", DateTime.Now) simplemente se equivocan
Christoph
1

Puedes probarlo de esta manera

Console.WriteLine(DateTime.Now.ToString("tt "));

La salida será así:

AM

o

PM
yazarloo
fuente
1
¿Sabe que está usando el código de la respuesta aceptada?
Thomas Ayoub
Estimado @ThomasAyoub: El código que está escrito es de una línea de la fuente de mi proyecto. Está funcionando ahora mismo.
yazarloo
Lo sentimos, esta es una respuesta muy pobre, especialmente porque presentamosNow
Wolf
0

Aquí hay una manera más fácil de escribir el formato de hora (hh:mm:ss tt)y mostrarlo por separado si lo desea.

string time = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00") + ":" + DateTime.Now.Second.ToString("00") + DateTime.Now.ToString(" tt");

o simplemente:

 DateTime.Now.ToString("hh:mm:ss tt")
Cero
fuente
0

La respuesta de @ Andy está bien. Pero si desea mostrar la hora sin formato de 24 horas, puede seguir de esta manera

string dateTime = DateTime.Now.ToString("hh:mm:ss tt", CultureInfo.InvariantCulture);

Después de eso, debería tener tiempo como "10:35:20 PM" o "10:35:20 AM"

Mahi Uddin
fuente
-1
string AM_PM = string.Format("{0:hh:mm:ss tt}", DateTime.Now).Split(new char[]{' '})[1];
Shah Bdr
fuente
-2

Aquí hay un código de ejemplo:

DateTime time = DateTime.Now;
string AM_PM;
AM_PM = time.ToLongTimeString().Substring(time.ToLongTimeString().Length - 2);
Praveen Manupati
fuente
2
Esta no es una solución confiable. ToLongTimeString()devuelve un valor basado en la cultura del hilo actual. Y a diferencia de algunas de las soluciones similares dadas en otras respuestas, este código ni siquiera funcionará si configura la cultura del hilo en InvariantCulture, porque la cultura invariante, LongTimePatternque es lo que determina el valor de retorno de, ToLongTimeString()es HH:mm:ss.
Joe Farrell