Come posso ottenere il valore AM / PM da un DateTime?


204

Il codice in questione è di seguito:

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()
    + " "
    ????????????????
}

come posso ottenere AM / PM dal dateTimevalore?


24
Ci sono modi molto migliori per formattare un DateTimedi questo. Vedere msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF

Usa solodateTime.ToString("tt");
David Jesus il

Risposte:


368

Che ne dite di:

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

3
È necessario aggiungere il nuovo System.Globalization.CultureInfo ("en-US") per ottenere ciò nel modo giusto (se non si sta già eseguendo il thread in un contesto americano)
thomas

1
@thomas - Buon punto. Modificato ora per specificareCultureInfo.InvariantCulture
Andy,

8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
IndieTech Solutions

Questo per ottenere AM / PM dalla data. Ma se voglio cambiare AM in PM in qualsiasi data. Quindi cosa dovrei fare ?
Ajay Sharma,

2
@AjaySharma Basta aggiungere 12 ore prima della valutazione del formato. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM,

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

Questo dovrebbe darti il ​​valore di stringa del tempo. dovrebbe aggiungere am / pm.

Puoi anche consultare l'argomento correlato:

Come si ottiene l'ora corrente del giorno?


8
Questo dovrebbe essere in lettere minuscole hhpoiché la tua rappresentazione attuale viene visualizzata in 24 ore con am e pm che è un po 'inutile
Non amato il

1
@LukeMcGregor Ho modificato la risposta secondo il tuo suggerimento.
Dottore Jones,

46

Il DateTimedovrebbe essere sempre internamente al (Gregoriano) Calendario "americano". Quindi se lo fai

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

dovresti ottenere quello che vuoi in molte meno righe.


33

Molto semplice usando il formato stringa

sopra .ToSTring("") :

  • se usi "hh" - >> L'ora, usando un orologio a 12 ore da 01 a 12.

  • se usi "HH" - >> L'ora, usando un orologio di 24 ore dalle 00 alle 23.

  • se si aggiunge "tt" - >> Il designatore Am / Pm.

esempio di conversione dalle 23:12 alle 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();

aspetta un secondo che non è tutto ciò di cui hai bisogno di preoccuparti di qualcos'altro è la cultura del sistema perché lo stesso codice eseguito su Windows con altre lingue specialmente con le lingue di cultura diversa genererà un risultato diverso con lo stesso codice

esempio di windows impostato sulla cultura del langage arabo mostrerà così:

// 23:12 م

م significa Sera (primo leter di مساء).

in un altro sistema la cultura dipende da ciò che è impostato sull'opzione windows e lingua di Windows, mostrerà // 23:12 du.

puoi cambiare tra diversi formati sul pannello di controllo di Windows in Windows regional e lingua -> formato corrente (casella combinata) e cambiare ... applicalo fai una ricostruzione (esegui) della tua app e guarda di cosa parla iam.

quindi chi posso forzare a mostrare le parole Am e Pm in inglese se la cultura del sistema attuale non è impostata in inglese?

facile semplicemente aggiungendo due righe: ->

il primo passo si aggiunge using System.Globalization;al codice

e modificando il codice precedente in questo modo:

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 => utilizzando il formato inglese predefinito.

un'altra domanda che desidero avere il pm in arabo o in una lingua specifica, anche se utilizzo windows impostato sul formato regionale inglese (o altra lingua)?

Soution per esempio arabo:

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

questo mostrerà // 23:12 م

evento se il mio sistema è impostato su un formato di regione inglese. puoi cambiare "ar-AE" se vuoi un altro formato di lingua. c'è un elenco di ogni lingua e il suo formato.

esempi:

ar          ar-SA       Arabic
ar-BH       ar-BH       Arabic (Bahrain)
ar-DZ       ar-DZ       Arabic (Algeria)
ar-EG       ar-EG       Arabic (Egypt)

big list...

fammi sapere se hai un'altra domanda.


Se voglio vedere "23:12"? Penso che la tua risposta sia incompleta.
Fjodr,

18

So che potrebbe sembrare estremamente tardi .. tuttavia può aiutare qualcuno là fuori

Volevo ottenere la parte PM della data, quindi ho usato ciò che Andy ha consigliato:

dateTime.ToString("tt");

Ho usato quella parte per costruire un Path per salvare i miei file .. Ho costruito i miei presupposti che otterrò AM o PM e nient'altro !!

tuttavia quando ho usato un PC la sua cultura non è l'inglese .. (nel mio caso ARABIC) .. la mia applicazione non è riuscita perché il formato "tt" ha restituito qualcosa di nuovo non AM né PM (م o ص) ..

Quindi la soluzione a questo era ignorare la cultura aggiungendo il secondo argomento come segue:

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

.. ovviamente devi aggiungere: usando System.Globalization; in cima al tuo file spero che possa aiutare qualcuno :)


3
Grazie per averlo aggiunto perché mi ha aiutato oggi: stavo ricevendo AM sul mio ambiente di sviluppo e AM su server remoto e non c'è stato un enorme aiuto da parte di Google fino a quando non ho letto questo post. Perfino Dotnetpearls afferma "Non ci sono punti nell'output di tt. Se hai bisogno di punti nel tuo AM o PM, dovresti manipolare la stringa." Il che ovviamente era del tutto falso nel mio caso ...
KiwiSunGoddess

13

è piuttosto semplice

  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"

Per il tuo esempio, ci sono modi migliori per formattare il datetime.


Vedi il link che @ChrisF ha fornito sopra. Fondamentalmente puoi usare il metodo ToString sull'oggetto datetime e passargli un formato. In questo modo non chiami datetime. ToString volte multiple come stai nell'esempio di codice.
Kevin Holditch,

2
Per quanto brutto possa sembrare, è un modo molto più semplice e coerente di fare confusione con culture diverse. Ad esempio, molte culture mostrano il tempo in 24 ore e non includono affatto AM / PM e ToString ("tt") produce una stringa vuota.
nathanchere,


4

Qualcosa del genere bool isPM = GetHour() > 11. Ma se vuoi formattare una data in una stringa, non dovresti farlo da solo. Usa le funzioni di formattazione della data per questo.


1
Onestamente, non mostrerei nemmeno il metodo isPM (). L' unico modo per formattare legittimamente gli oggetti DateTime è usare i formattatori.
richb01,

@ richb01 Non sono d'accordo. L'unico modo sicuro è non usare affatto am / pm e usare il formato 24h, aggiungere sempre la cultura invariante o farlo manualmente. "am" e "pm" non sono compilati ad esempio in lingua tedesca, è solo vuoto. Se qualcuno scrive String.Format ("{0: hh: mm tt}", DateTime.Now) si sbagliano semplicemente
Christoph,

1

Puoi provarlo in questo modo

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

L'output sarà così:

AM

o

PM

1
Sei consapevole di utilizzare il codice della risposta accettata?
Thomas Ayoub,

Caro @ThomasAyoub, Il codice che viene scritto proviene da una riga della fonte del mio progetto. sta funzionando proprio ora.
yazarloo,

Siamo spiacenti, questa è una risposta molto scadente, soprattutto perché presentaNow
Wolf

0

Ecco un modo più semplice per scrivere il formato dell'ora (hh:mm:ss tt)e visualizzarli separatamente, se lo desideri.

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

o semplicemente:

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

0

@ La risposta di Andy va bene. Ma se vuoi mostrare l'ora senza il formato 24 ore, puoi seguire in questo modo

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

Dopodiché, dovresti avere il tempo come "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

Ecco qualche esempio di codice:

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

2
Questa non è una soluzione affidabile. ToLongTimeString()restituisce un valore basato sulla cultura del thread corrente. E a differenza di alcune delle soluzioni simili fornite in altre risposte, questo codice non funzionerà nemmeno se imposti la cultura del thread su InvariantCulture, perché la cultura invariante, LongTimePatternche è ciò che determina il valore di ritorno di, ToLongTimeString()è HH:mm:ss.
Joe Farrell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.