2011-10-24 11 views
149

Il codice in questione è qui sotto:Come si ottiene il valore AM/PM da un DateTime?

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 l'AM/PM dal valore dateTime?

+19

Ci sono molti modi migliori per formattare un 'DateTime' di questo. Vedi http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx – ChrisF

risposta

273

ne dite:

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

È necessario aggiungere nuovo System.Globalization.CultureInfo ("en-US") per farlo correttamente (se non si sta già eseguendo il thread in un contesto statunitense) – thomas

+1

@thomas - Buon punto. Modificato ora per specificare 'CultureInfo.InvariantCulture' – Andy

+2

' ToString ("tt", System.Globalization.CultureInfo.InvariantCulture) ' –

4

Qualcosa come bool isPM = GetHour() > 11. Ma se vuoi formattare una data su una stringa, non dovresti farlo tu stesso. Utilizzare le funzioni date formatting per quello.

+1

Onestamente, non vorrei nemmeno mostrare il metodo isPM(). Il * solo * modo di formattare legittimamente gli oggetti DateTime sta utilizzando i formattatori. – richb01

+0

@ richb01 Non sono d'accordo. L'unico modo sicuro è di non utilizzare affatto am/pm e utilizzare il formato 24 ore, aggiungere sempre la cultura invariante o eseguirla manualmente. "am" e "pm" non sono compilati ad es. in lingua tedesca, è solo vuoto. Se qualcuno scrive String.Format ("{0: hh: mm tt}", DateTime.Now) hanno semplicemente sbagliato i tempi – Christoph

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

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

+0

grazie per la risposta/vorrebbe mostrare gli altri modi – MoonLight

+0

Vedere il link che @ChrisF ha fornito sopra. Fondamentalmente è possibile utilizzare il metodo ToString sull'oggetto datetime e passarlo in un formato. In questo modo non chiamerai più volte datetime.ToString come fai nel tuo esempio di codice. –

+0

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

31

Il DateTime deve essere sempre internamente nel calendario "americano" (gregoriano). Quindi se lo fai

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

si dovrebbe ottenere quello che vuoi in molte meno linee.

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

Questo dovrebbe darvi il valore di stringa del tempo. tt dovrebbe aggiungere l'am/pm.

È inoltre possibile consultare il relativo argomento:

How do you get the current time of day?

+8

Questo dovrebbe essere in minuscolo 'hh' dato che la tua attuale rappresentazione viene emessa in 24 ore con am e pm che è un po 'inutile –

+1

@LukeMcGregor Ho modificato la risposta come da tuo suggerimento. –

14

So che questo potrebbe sembrare estremamente in ritardo .. tuttavia può aiutare qualcuno là fuori

ho voluto ottenere la parte AM PM della data, quindi ho usato quello che Andy consigliato:

dateTime.ToString("tt"); 

ho usato quella parte per costruire un percorso per salvare i miei file .. ho costruito la mia ipotesi che Avrò o AM o PM e nient'altro !!

però quando ho usato un PC che la sua cultura non è l'inglese .. (nel mio caso ARABO) .. la mia applicazione non è riuscito becase il formato "tt" ha prodotto qualcosa di nuovo non sono né PM (م o ص) ..

Quindi la correzione per questo è stato quello di ignorare la cultura con l'aggiunta del secondo argomento come segue:

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

.. naturalmente u deve aggiungere: using System.Globalizzazione; sulla parte superiore del ur file di Spero che aiuterà qualcuno :)

+1

Grazie per aver aggiunto questo come mi ha aiutato oggi - Stavo ricevendo A.M. sul mio ambiente di sviluppo e AM sul server remoto e non c'era una grande quantità di aiuto da google con esso fino a quando ho letto questo post. Anche Dotnetpearls afferma "Non ci sono periodi nell'output di tt. Se hai bisogno di periodi nel tuo AM o PM, dovresti manipolare la stringa."Che ovviamente era completamente falso nel mio caso ... – KiwiSunGoddess

-2

Ecco qualche esempio di codice:

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

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 si imposta la cultura del filo su 'InvariantCulture', perché il' LongTimePattern' della cultura invariante, che determina il valore restituito di 'ToLongTimeString()' -is 'HH: mm: ss'. –

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

molto semplice utilizzando il formato stringa

su .ToSTring("") :

  • se si utilizza "hh" - >> L'ora, utilizzando un orologio a 12 ore f ROM 01 a 12.

  • se si utilizza "HH" - >> l'ora, utilizzando il formato 24 ore dalle 00 alle 23.

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

exemple conversione 23:12-11:12:

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 attimo che non è tutto ciò che serve per la cura di un'altra cosa è la cultura del sistema, perché lo stesso codice eseguito su finestre con altre langage especialy con langage cultura difrent genereranno risultato difrent con lo stesso codice

esempio di finestre fissati alla cultura araba langage mostrerà così:

01.235.

// 23:12 su

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

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

è possibile passare da un formato all'altro sul pannello di controllo di Windows in Windows regionale e lingua -> formato corrente (combobox) e cambiare ... applicarlo a una ricostruzione (esecuzione) della tua app e guardare di cosa iam parla.

così chi posso forzare la visualizzazione di parole AM ​​e Pm in inglese se la cultura del> sistema attuale non è impostata su inglese?

facile solo con l'aggiunta di due linee: ->

il primo passo aggiungere using System.Globalization; sulla parte superiore del vostro codice

e modifing il codice precedente per essere come questo:

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 voglio che il pm sia in arabo o in una lingua specifica, anche se uso windows impostato sul formato regionale in inglese (o in altre lingue)?

Soution per l'arabo Esempio:

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. è possibile modificare "ar-AE" se si desidera un altro formato di lingua. c'è una lista 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... 

mi fanno sapere se avete un'altra domanda.

+0

If I voglio vedere "11:12 PM"? Penso che la tua risposta sia incompleta – Fjodr

+0

sì vero, mi correggerò – Bilal

-1

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

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

è possibile verificare in questo modo

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

L'output sarà simile a questo:

AM 

o

012.
PM 
+0

Sei consapevole che stai usando il codice della risposta accettata? –

+0

Caro @ThomasAyoub, Il codice che è scritto proviene da una linea della mia fonte di progetto, funziona proprio ora. – yazarloo

Problemi correlati