Konwertuj wartość zakresu czasu na format „hh: mm Am / Pm” przy użyciu C #


82

Mam wartość przechowywaną w zmiennej typu System.TimeSpanw następujący sposób.

System.TimeSpan storedTime = 03:00:00;

Czy mogę ponownie zapisać go w innej zmiennej typu Stringw następujący sposób?

String displayValue = "03:00 AM";

A jeśli storedTimezmienna ma wartość

storedTime = 16:00:00;

następnie należy go przekonwertować na:

String displayValue = "04:00 PM";

Odpowiedzi:


191

Możesz to zrobić, dodając swój przedział czasu do daty.

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"

czy można dodać domyślny czas z tego selektora dat ładowania początkowego, np .: datepicker value + TimeofDay?
Shaiju T

1
Należy pamiętać, że zawsze będzie to 12-godzinny czas z prefiksem AM / PM. Jeśli chcesz, aby wynik był zgodny z daną kulturą, możesz ShortTimePatternzamiast tego użyć :string displayTime = time.ToString("t" [, culture]);
Sphinxxx

1
Możesz też po prostu zadzwonićtime.ToShortTimeString()
Mardok

time.ToShortTimeString () nie zachowuje poprzedniego 0 w godzinie 15:00. time.ToString ("hh: mm tt") zajmuje się tym
Souvik Basu

Chcę TimeSpan bez żadnej daty, może nie ma to znaczenia, ale wiążesz dzisiejszą datę i nie jest to poprawne. Używanie podobnego ciągu.Format (@ "{0: hh \: mm \: ss}", timespan) jest lepsze, ale nie Nie wiem, jak dodać do tego AM / PM :(
QMaster

13

Bardzo proste dzięki zastosowaniu formatu string

na .ToSTring("") :

  • jeśli używasz „hh” - >> Godzina, używając zegara 12-godzinnego od 01 do 12.

  • jeśli używasz „HH” - >> Godzina, używając zegara 24-godzinnego od 00 do 23.

  • jeśli dodasz "tt" - >> Oznacznik Am / Pm.

przykład konwersji z 23:12 na 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();

poczekaj sekundę, to nie wszystko, czego potrzebujesz, aby przejmować się czymś innym, to kultura systemu, ponieważ ten sam kod wykonywany w systemie Windows z innym językiem, szczególnie z innym językiem kultury, wygeneruje inny wynik z tym samym kodem

przykład okien ustawionych na kulturę języka arabskiego będzie wyglądał następująco:

// 23:12 م

م oznacza Wieczór (pierwsza litera مساء).

w innej kulturze systemowej zależy od tego, co jest ustawione w opcji regionalnej i językowej systemu Windows, pokaże // 23:12 du.

możesz zmieniać między różnymi formatami w panelu sterowania Windows pod Windows regionalny i język -> aktualny format (combobox) i zmienić ... zastosuj, przebuduj (uruchom) swoją aplikację i zobacz, o czym mówię.

więc kto mogę wymusić wyświetlanie słów Am i Pm w języku angielskim, jeśli kultura obecnego systemu nie jest ustawiona na język angielski?

łatwe, po prostu dodając dwie linie: ->

pierwszy krok dodaj using System.Globalization;na górze swojego kodu

i modyfikując Poprzedni kod tak, aby wyglądał następująco:

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 => używając domyślnego formatu angielskiego.

kolejne pytanie Chcę, aby PM było w języku arabskim lub w określonym języku, nawet jeśli używam systemu Windows ustawionego na angielski (lub inny język) w formacie regionalnym?

Soution na przykład arabski:

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

to pokaże // 23:12 م

zdarzenie, jeśli mój system jest ustawiony na format regionu angielskiego. możesz zmienić „ar-AE”, jeśli chcesz na inny format języka. istnieje lista każdego języka i jego formatu.

przykłady: ar ar-SA arabski ar-BH ar-BH arabski (Bahrajn) ar-DZ ar-DZ arabski (Algieria) ar-EG ar-EG arabski (Egipt)


5
Pytanie zadawane o TimeSpan. Ta odpowiedź dotyczy daty i godziny.
thelem


10
string displayValue="03:00 AM";

To jest moment w czasie , a nie czas trwania (TimeSpan).

Więc coś jest nie tak z twoim podstawowym projektem lub założeniami.

Jeśli chcesz go użyć, musisz najpierw przekonwertować go na DateTime (punkt w czasie). Możesz sformatować DateTime bez części daty, która byłaby żądanym ciągiem.

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

Zmienna storeTime może mieć wartość taką jak
storeTime=16:00:00;

Nie, może mieć wartość godziny 4, ale reprezentacja jest binarna, TimeSpan nie może rejestrować różnicy między 16:00i 4 pm.


11
To niefortunne, że DateTime.TimeOfDayzwraca TimeSpan- Microsoft prowadzi cię do tego projektu :(
Jon Skeet

2
@JonSkeet Nie wiem, czy to najgorszy projekt (i wiem, że jesteś wybredny w tej sprawie, z szacunkiem, biorąc pod uwagę Twoją pracę nad Nodą), to kwestia zrozumienia ograniczeń interpretacji. Nie ma pojęcia o krewnym DateTime, gdyby istniał, to to („03:00 rano”) byłoby po prostu przykładem tego. Jednak widzę, że w większości przypadków użycia ten projekt (krewny DateTime) nadmiernie skomplikowałby kwestie (oczywiście odbywa się to kosztem utrudnienia wykonywania bardzo konkretnej pracy wokół dat, godzin, bezwzględnych lub nie , strefy czasowe itp.)
casperOne

7
@casperOne: Zasadniczo używa jednego typu do reprezentowania informacji, które logicznie byłyby przechowywane w innym typie, tylko dlatego, że jeśli zmrużysz oczy, wyglądają podobnie. Nie sugerowałbym DateTimejeszcze większego przeładowania znaczenia (jest już wystarczająco złe). Powinien istnieć typ reprezentujący „porę dnia” - co oczywiście jest dokładnie tym, co zaimplementowałem w Noda Time. Ilekroć spróbujesz upchnąć wiele różnych koncepcji w niewielkiej liczbie typów, z pewnością napotkasz takie problemy.
Jon Skeet

1
Ta odpowiedź jest świetna, ponieważ wyjaśnia, dlaczego TimeSpan zachowuje się tak, jak robi, a nie tylko, jak rozwiązać problem. Naprawdę nie powinno być trzy rodzaje: DateTime, TimeOfDayi Date.
thelem

03:00 AMnie jest „punktem w czasie”. To „punkt w ciągu dnia”.
Alex

10

Trochę piggybacking istniejących odpowiedzi tutaj:

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

3
To jest najbardziej rozsądna odpowiedź
toddmo

9

Będziesz musiał zdobyć DateTimeprzedmiot od swojegoTimeSpan a następnie możesz go łatwo sformatować.

Jednym z możliwych rozwiązań jest dodanie zakresu czasu do dowolnej daty o zerowej wartości czasu.

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

Wartość wyjściowa to "03:00 AM"(dla angielskich ustawień regionalnych).


6

Nie możesz dodać AM / PM do pliku TimeSpan. W każdym razie będziesz musiał powiązać TimaSpanwartość zDateTime jeśli chcesz wyświetlać czas w formacie 12-godzinnym.

TimeSpannie jest przeznaczony do użytku z 12-godzinnym formatem zegara, ponieważ mówimy o przedziale czasu .

Jak mówi w dokumentacji ;

TimeSpanObiektu reprezentuje przedział czasu (czas trwania, albo w miarę upływu czasu), które mierzy się jako dodatnią lub ujemną liczbą dni lub godzin, minut, sekund i ułamków sekundy. TimeSpanStruktura może być również używany do reprezentowania porze dnia, ale tylko wtedy, gdy czas nie jest związana z konkretną datą. W przeciwnym razie należy użyć struktury DateTimelub DateTimeOffset.

Również Microsoft Docs opisuje jak następuje;

TimeSpanWartość może być reprezentowane [-]d.hh:mm:ss.ff, gdzie opcjonalnie znak minus oznacza ujemny odstęp czas, a jego dskładnikiem jest dni, hhjest godzin, mierzoną w 24-godzinnym , mmznajduje się kilka, ssjest sekund i ffjest ułamki sekundy.

W takim przypadku możesz wyświetlać jako AM / PM w następujący sposób.

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


Uwaga dodatkowa :
należy również pamiętać, że właściwość TimeOfDayDateTime to a TimeSpan, gdzie reprezentuje

przedział czasu , który reprezentuje część dnia, w którym upłynął od północy.


3

Przeanalizuj przedział czasu do DateTime, a następnie użyj formatu („hh: mm: tt”). Na przykład.

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 będzie:

str = "04:00 PM"

2

Możesz spróbować tego:

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

możesz usunąć hh lub mm, ss lub tt w zależności od potrzeb, gdzie hh to godzina w formacie 12-godzinnym, mm to minuty, ss to sekundy, a tt to AM / PM.


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

0

Najpierw musisz przekonwertować zakres czasu na strukturę DateTime:

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

Następnie musisz przekonwertować wartość na ciąg w formacie Short Time

var result = dt.ToString("t"); // Convert to string using Short Time format
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.