¿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?


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);

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?


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.


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.


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 :)


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

10
+ PC.GetHour(datetime) > 11 ? "pm" : "am"

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


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.


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

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")

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"


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

-2

Aquí hay un código de ejemplo:

DateTime time = DateTime.Now;
string AM_PM;
AM_PM = time.ToLongTimeString().Substring(time.ToLongTimeString().Length - 2);

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.