Konvertieren Sie den Zeitspannenwert mit C # in das Format „hh: mm Am / Pm“.

82

Ich habe einen Wert in einer Variablen vom Typ System.TimeSpanwie folgt gespeichert .

System.TimeSpan storedTime = 03:00:00;

Kann ich es Stringwie folgt in einer anderen Variablen des Typs speichern ?

String displayValue = "03:00 AM";

Und wenn storedTimeVariable den Wert von hat

storedTime = 16:00:00;

dann sollte es konvertiert werden zu:

String displayValue = "04:00 PM";
Amit Kumar
quelle

Antworten:

191

Sie können dies tun, indem Sie Ihre Zeitspanne zum Datum hinzufügen.

TimeSpan timespan = new TimeSpan(03,00,00);
DateTime time = DateTime.Today.Add(timespan);
string displayTime = time.ToString("hh:mm tt"); // It will give "03:00 AM"
Asif Mushtaq
quelle
Ist es möglich, eine Standardzeit aus dieser Bootstrap-Datumsauswahl hinzuzufügen, z. B.: datepicker value + TimeofDay?
Shaiju T
1
Beachten Sie, dass dies immer die 12-Stunden- Uhrzeit mit einem AM / PM-Präfix angibt. Wenn Sie möchten, dass das Ergebnis einer bestimmten Kultur folgt, können Sie ShortTimePatternstattdessen string displayTime = time.ToString("t" [, culture]);
Folgendes
1
Oder Sie können einfach anrufentime.ToShortTimeString()
Mardok
time.ToShortTimeString () behält die vorhergehende 0 um 15:00 Uhr nicht bei. time.ToString ("hh: mm tt") kümmert sich darum
Souvik Basu
Ich möchte TimeSpan ohne Datum, spielt vielleicht keine Rolle, aber Sie binden das heutige Datum und es ist nicht richtig. Die Verwendung von like string.Format (@ "{0: hh \: mm \: ss}", Zeitspanne) ist besser, aber ich ziehe es nicht an
Ich
13

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 => mit dem 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 Arabisch ar-BH ar-BH Arabisch (Bahrain) ar-DZ ar-DZ Arabisch (Algerien) ar-EG ar-EG Arabisch (Ägypten)

Bilal
quelle
5
Die Frage zu TimeSpan. Diese Antwort ist für DateTime.
Thelem
11

Sie können das TimeSpanzu einem hinzufügen DateTime, zum Beispiel:

TimeSpan span = TimeSpan.FromHours(16);
DateTime time = DateTime.Today + span;
String result = time.ToString("hh:mm tt");

Demo: http://ideone.com/veJ6tT

04:00 PM

Standardzeichenfolgen für Datum und Uhrzeit

Tim Schmelter
quelle
Danke, nach Stunden habe ich es versucht 11:57 pmund das hat funktioniert: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
Shaiju T
10
string displayValue="03:00 AM";

Dies ist ein Zeitpunkt , keine Dauer (TimeSpan).

Es stimmt also etwas nicht mit Ihrem grundlegenden Design oder Ihren Annahmen.

Wenn Sie es verwenden möchten, müssen Sie es zuerst in eine DateTime (Zeitpunkt) konvertieren. Sie können eine DateTime ohne den Datumsteil formatieren, das wäre Ihre gewünschte Zeichenfolge.

TimeSpan t1 = ...;
DateTime d1 = DateTime.Today + t1;               // any date will do
string result = d1.ToString("hh:mm:ss tt");

Die Variable storeTime kann einen Wert wie haben
storeTime=16:00:00;

Nein, es kann einen Wert von 4 Uhr haben, aber die Darstellung ist binär. Ein TimeSpan kann den Unterschied zwischen 16:00und nicht aufzeichnen 4 pm.

Henk Holterman
quelle
11
Es ist bedauerlich, dass DateTime.TimeOfDayein TimeSpan- Microsoft führt Sie zu diesem Design zurück :(
Jon Skeet
2
@ JonSkeet Ich weiß nicht, dass es das schlechteste Design ist (und ich weiß, dass Sie in dieser Angelegenheit respektvoll sind, respektvoll angesichts Ihrer Arbeit an Noda), es geht darum, die Grenzen der Interpretation zu verstehen. Es gibt kein Konzept für einen Verwandten DateTime, wenn es einen gäbe, dann wäre dies ("03:00 Uhr") einfach ein Beispiel dafür. Ich kann jedoch sehen, dass dieses Design (ein Verwandter DateTime) in den meisten Anwendungsfällen die Probleme überkomplizieren würde (dies geht natürlich zu Lasten der Kompliziertheit bei der Durchführung sehr spezifischer Arbeiten um Daten, Zeiten, absolut oder nicht , Zeitzonen usw.)
casperOne
7
@casperOne: Grundsätzlich wird ein Typ verwendet, um Informationen darzustellen, die logischerweise in einem anderen Typ gespeichert würden, nur weil sie ähnlich aussehen, wenn Sie stark genug blinzeln. Ich würde nicht vorschlagen, die Bedeutung von DateTimenoch weiter zu überladen (es ist schon schlimm genug). Es sollte einen Typ geben, der eine "Tageszeit" darstellt - was natürlich genau das ist, was ich in Noda Time implementiert habe. Immer wenn Sie versuchen, viele verschiedene Konzepte in eine kleine Anzahl von Typen zu packen, treten Probleme wie diese auf.
Jon Skeet
1
Diese Antwort ist großartig, da sie erklärt, warum sich TimeSpan so verhält, wie es funktioniert, und nicht nur, wie das Problem behoben werden kann. Wirklich sollte es drei Arten sein: DateTime, TimeOfDayund Date.
Thelem
03:00 AMist kein "Zeitpunkt". Es ist ein "Punkt an einem Tag".
Alex
10

Hier können Sie vorhandene Antworten huckepack nehmen:

public static string ToShortTimeSafe(this TimeSpan timeSpan)
{
    return new DateTime().Add(timeSpan).ToShortTimeString();
} 

public static string ToShortTimeSafe(this TimeSpan? timeSpan)
{
    return timeSpan == null ? string.Empty : timeSpan.Value.ToShortTimeSafe();
}
Chris Marisic
quelle
3
Dies ist die vernünftigste Antwort
Toddmo
9

Sie müssen ein DateTimeObjekt von Ihrem abrufen TimeSpanund können es dann einfach formatieren.

Eine mögliche Lösung besteht darin, die Zeitspanne zu einem beliebigen Datum mit einem Zeitwert von Null hinzuzufügen.

var timespan = new TimeSpan(3, 0, 0);
var output = new DateTime().Add(timespan).ToString("hh:mm tt");

Der Ausgabewert ist "03:00 AM"(für das englische Gebietsschema).

Michal Klouda
quelle
5

Sie können nicht hinzufügen , AM / PM zu ein TimeSpan. Sie müssen den TimaSpanWert trotzdem zuordnen, DateTimewenn Sie die Uhrzeit im 12-Stunden-Format anzeigen möchten.

TimeSpanist nicht für die Verwendung mit einem 12-Stunden-Format vorgesehen, da es sich hier um ein Zeitintervall handelt .

Wie es in der Dokumentation heißt ;

Ein TimeSpanObjekt stellt ein Zeitintervall (Zeitdauer oder verstrichene Zeit) dar, das als positive oder negative Anzahl von Tagen, Stunden, Minuten, Sekunden und Bruchteilen einer Sekunde gemessen wird . Die TimeSpanStruktur kann auch verwendet werden, um die Uhrzeit darzustellen, jedoch nur, wenn die Uhrzeit nicht mit einem bestimmten Datum zusammenhängt. Andernfalls sollte stattdessen die Struktur DateTimeoder DateTimeOffsetverwendet werden.

Auch Microsoft Docs beschreibt Folgendes:

Ein TimeSpanWert kann wie folgt dargestellt werden [-]d.hh:mm:ss.ff: Das optionale Minuszeichen zeigt ein negatives Zeitintervall an, die dKomponente ist Tage, hhist Stunden, gemessen im 24-Stunden-Format , mmist Minuten, ssist Sekunden und ffist Sekundenbruchteile.

In diesem Fall können Sie also wie folgt mit AM / PM anzeigen.

TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");


Randnotiz :
Beachten Sie auch, dass die TimeOfDay- Eigenschaft von a DateTimeist TimeSpan, wo sie steht

Ein Zeitintervall , das den Bruchteil des Tages darstellt, der seit Mitternacht vergangen ist.

Neugier
quelle
3

Analysieren Sie die Zeitspanne auf DateTime und verwenden Sie dann Format ("hh: mm: tt"). Zum Beispiel.

TimeSpan ts = new TimeSpan(16, 00, 00);
DateTime dtTemp = DateTime.ParseExact(ts.ToString(), "HH:mm:ss", CultureInfo.InvariantCulture);
string str = dtTemp.ToString("hh:mm tt");

str wird sein:

str = "04:00 PM"
Habib
quelle
2

Sie können dies versuchen:

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

Sie können hh oder mm oder ss oder tt je nach Bedarf entfernen, wobei hh Stunde in 12-Stunden-Formiat, mm Minuten, ss Sekunden und tt AM / PM ist.

Ankit
quelle
1
Parse timespan to DateTime. For Example.    
//The time will be "8.30 AM" or "10.00 PM" or any time like this format.
    public TimeSpan GetTimeSpanValue(string displayValue) 
        {   
            DateTime dateTime = DateTime.Now;
                if (displayValue.StartsWith("10") || displayValue.StartsWith("11") || displayValue.StartsWith("12"))
                          dateTime = DateTime.ParseExact(displayValue, "hh:mm tt", CultureInfo.InvariantCulture);
                    else
                          dateTime = DateTime.ParseExact(displayValue, "h:mm tt", CultureInfo.InvariantCulture);
                    return dateTime.TimeOfDay;
                }
Nandha Kumar
quelle
0

Zunächst müssen Sie die Zeitspanne in die DateTime-Struktur konvertieren:

var dt = new DateTime(2000, 12, 1, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds)

Dann müssen Sie den Wert in eine Zeichenfolge im Kurzzeitformat konvertieren

var result = dt.ToString("t"); // Convert to string using Short Time format
STO
quelle