Wie erhalte ich den AM / PM-Wert von einer DateTime?

204

Der fragliche Code ist unten:

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

Wie kann ich die AM / PM aus dem dateTimeWert erhalten?

SilverLight
quelle
24
Es gibt weitaus bessere Möglichkeiten, a zu formatieren DateTime. Siehe msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF
Verwenden Sie einfachdateTime.ToString("tt");
David Jesus

Antworten:

368

Wie wäre es mit:

dateTime.ToString("tt", CultureInfo.InvariantCulture);
Andy
quelle
3
Sie müssen eine neue System.Globalization.CultureInfo ("en-US") hinzufügen, um dies richtig zu machen (wenn Sie den Thread nicht bereits in einem US-Kontext
ausführen
1
@ Thomas - Guter Punkt. Bearbeitet jetzt zu spezifizierenCultureInfo.InvariantCulture
Andy
8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
IndieTech Solutions
Dies für AM / PM ab Datum erhalten. Aber wenn ich AM zu einem beliebigen Zeitpunkt in PM ändern möchte. Was soll ich dann tun ?
Ajay Sharma
2
@ AjaySharma Fügen Sie einfach 12 Stunden vor der Formatbewertung hinzu. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM
107
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

Dies sollte Ihnen den Zeichenfolgenwert der Zeit geben. Es sollte am / pm angehängt werden.

Sie können sich auch das verwandte Thema ansehen:

Wie erhält man die aktuelle Tageszeit?

XikiryoX
quelle
8
Dies sollte in Kleinbuchstaben erfolgen, hhda Ihre aktuelle Darstellung in 24-Stunden-Zeit mit morgens und abends ausgegeben wird, was ein bisschen sinnlos ist
nicht geliebt am
1
@LukeMcGregor Ich habe die Antwort gemäß Ihrem Vorschlag geändert.
Doktor Jones
46

Das DateTimesollte immer intern im "amerikanischen" (Gregorianischen) Kalender stehen. Also wenn du es tust

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

Sie sollten in viel weniger Zeilen bekommen, was Sie wollen.

Xanatos
quelle
33

Sehr einfach mit dem String-Format

auf .ToSTring("") :

  • Wenn Sie "hh" - >> Die Stunde verwenden, verwenden Sie eine 12-Stunden-Uhr von 01 bis 12.

  • Wenn Sie "HH" verwenden - >> Die Stunde mit einer 24-Stunden-Uhr von 00 bis 23.

  • Wenn Sie "tt" hinzufügen - >> Der Am / Pm-Bezeichner.

Beispiel Konvertierung von 23:12 auf 23:12 Uhr:

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

Warten Sie eine Sekunde, das ist nicht alles, was Sie brauchen, um sich um etwas anderes zu kümmern, ist die Systemkultur, da der gleiche Code, der unter Windows mit einer anderen Sprache ausgeführt wird, insbesondere mit einer anderen Kultursprache, ein anderes Ergebnis mit demselben Code erzeugt

Ein Beispiel für Fenster, die auf arabische Sprachkultur eingestellt sind, wird folgendermaßen angezeigt:

// 23:12 م

م bedeutet Abend (erster Brief von مساء).

In einer anderen Systemkultur hängt es davon ab, was in der Windows-Regional- und Sprachoption festgelegt ist. Es wird // 23:12 du angezeigt.

Sie können in der Windows-Systemsteuerung unter Windows Regional und Sprache zwischen verschiedenen Formaten wechseln -> aktuelles Format (Combobox) und ändern ... anwenden. Führen Sie eine Neuerstellung (Ausführung) Ihrer App durch und beobachten Sie, worüber ich spreche.

Wen kann ich also zwingen, Am- und Pm-Wörter auf Englisch anzuzeigen, wenn die Kultur des aktuellen Systems nicht auf Englisch eingestellt ist?

einfach durch Hinzufügen von zwei Zeilen: ->

Im ersten Schritt fügen Sie using System.Globalization;Ihren Code hinzu

und Ändern des vorherigen Codes wie folgt:

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 => im englischen Standardformat.

Eine andere Frage: Ich möchte, dass die Uhr in Arabisch oder einer bestimmten Sprache ist, auch wenn ich Fenster verwende, die auf das regionale Format Englisch (oder eine andere Sprache) eingestellt sind.

Soution für Arabisch Beispiel:

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

Dies zeigt // 23:12 م

Ereignis, wenn mein System auf ein englisches Regionsformat eingestellt ist. Sie können "ar-AE" ändern, wenn Sie ein anderes Sprachformat verwenden möchten. Es gibt eine Liste jeder Sprache und ihres Formats.

Beispiele:

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

big list...

Lassen Sie mich wissen, wenn Sie eine andere Frage haben.

Bilal
quelle
Wenn ich "23:12 Uhr" sehen möchte? Ich denke, Ihre Antwort ist unvollständig.
Fjodr
18

Ich weiß, dass dies extrem spät zu sein scheint. Es kann jedoch jemandem da draußen helfen

Ich wollte den AM PM-Teil des Termins erhalten, also habe ich das verwendet, was Andy empfohlen hat:

dateTime.ToString("tt");

Ich habe diesen Teil verwendet, um einen Pfad zum Speichern meiner Dateien zu erstellen. Ich habe meine Annahmen getroffen, dass ich entweder AM oder PM und sonst nichts bekomme !!

Als ich jedoch einen PC verwendete, dessen Kultur nicht Englisch ist. (in meinem Fall ARABISCH). Meine Anwendung schlug fehl, da das Format "tt" etwas Neues zurückgab, weder AM noch PM (م oder ص).

Die Lösung bestand darin, die Kultur zu ignorieren, indem das zweite Argument wie folgt hinzugefügt wurde:

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

.. natürlich müssen Sie hinzufügen: using System.Globalization; Ich hoffe, das hilft jemandem :)

sucheSO
quelle
3
Vielen Dank, dass Sie dies hinzugefügt haben, da es mir heute geholfen hat. Ich habe AM in meiner Entwicklungsumgebung und AM auf dem Remote-Server erhalten, und es gab keine große Hilfe von Google, bis ich diesen Beitrag gelesen habe. Sogar Dotnetpearls sagt: "Es gibt keine Punkte in der Ausgabe von tt. Wenn Sie Punkte in Ihrem AM oder PM benötigen, müssten Sie den String manipulieren." Was in meinem Fall natürlich völlig
falsch war
13

es ist ziemlich einfach

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

Für Ihr Beispiel gibt es jedoch bessere Möglichkeiten, datetime zu formatieren.

Kevin Holditch
quelle
Siehe den Link, den @ChrisF oben angegeben hat. Grundsätzlich können Sie die ToString-Methode für das datetime-Objekt verwenden und ihm ein Format übergeben. Auf diese Weise rufen Sie datetime.ToString nicht mehrmals auf, wie Sie es in Ihrem Codebeispiel tun.
Kevin Holditch
2
So hässlich dies auch erscheinen mag, es ist eine weitaus einfachere und konsequentere Art, als mit verschiedenen Kulturen herumzuspielen. Beispielsweise zeigen viele Kulturen die Zeit in 24 Stunden an und enthalten AM / PM überhaupt nicht, und ToString ("tt") erzeugt eine leere Zeichenfolge.
Nathanchere
4

So etwas wie bool isPM = GetHour() > 11. Wenn Sie jedoch ein Datum in eine Zeichenfolge formatieren möchten, sollten Sie dies nicht selbst tun müssen. Verwenden Sie dazu die Datumsformatierungsfunktionen .

CodesInChaos
quelle
1
Ehrlich gesagt würde ich nicht einmal die isPM () -Methode zeigen. Die einzige Möglichkeit, DateTime-Objekte legitim zu formatieren, ist die Verwendung der Formatierer.
richb01
@ richb01 Ich bin anderer Meinung. Der einzig sichere Weg besteht darin, am / pm überhaupt nicht zu verwenden und das 24-Stunden-Format zu verwenden, die invariante Kultur immer anzuhängen oder manuell auszuführen. "am" und "pm" werden nicht zB in deutscher Sprache ausgefüllt, es ist nur leer. Wenn jemand String.Format ("{0: hh: mm tt}", DateTime.Now) schreibt, bekommt er einfach falsche Zeiten
Christoph
1

Sie können es auf diese Weise testen

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

Die Ausgabe sieht folgendermaßen aus:

AM

oder

PM
Yazarloo
quelle
1
Ist Ihnen bewusst, dass Sie den Code der akzeptierten Antwort verwenden?
Thomas Ayoub
Sehr geehrter @ThomasAyoub, der geschriebene Code stammt aus einer Zeile meiner Projektquelle. es funktioniert gerade.
Yazarloo
Entschuldigung, dies ist eine sehr schlechte Antwort, vor allem, weil EinführungNow
Wolf
0

Hier ist eine einfachere Möglichkeit, das Zeitformat zu schreiben (hh:mm:ss tt)und es auf Wunsch separat anzuzeigen.

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

oder einfach nur:

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

@ Andys Antwort ist Okay. Wenn Sie jedoch Zeit ohne 24-Stunden-Format anzeigen möchten, können Sie folgendermaßen vorgehen

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

Danach sollten Sie Zeit wie "10:35:20 PM" oder "10:35:20 AM" bekommen.

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

Hier ist ein Beispielcode:

DateTime time = DateTime.Now;
string AM_PM;
AM_PM = time.ToLongTimeString().Substring(time.ToLongTimeString().Length - 2);
Praveen Manupati
quelle
2
Dies ist keine zuverlässige Lösung. ToLongTimeString()Gibt einen Wert zurück, der auf der aktuellen Thread-Kultur basiert. Und im Gegensatz zu einigen ähnlichen Lösungen, die in anderen Antworten angegeben sind, funktioniert dieser Code nicht einmal, wenn Sie die Thread-Kultur auf einstellen InvariantCulture, da die invariante Kultur LongTimePattern- die den Rückgabewert von bestimmt ToLongTimeString()- ist HH:mm:ss.
Joe Farrell