Jak uzyskać wartość AM / PM z DateTime?

204

Kod, o którym mowa, znajduje się poniżej:

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

Jak mogę uzyskać AM / PM od dateTimewartości?

SilverLight
źródło
24
Są o wiele lepsze sposoby formatowania DateTimeniż to. Zobacz msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF
Wystarczy użyćdateTime.ToString("tt");
David Jesus,

Odpowiedzi:

368

Co powiesz na:

dateTime.ToString("tt", CultureInfo.InvariantCulture);
Andy
źródło
3
Musisz dodać nowy System.Globalization.CultureInfo („en-US”), aby uzyskać to prawidłowe (jeśli nie prowadzisz jeszcze wątku w kontekście amerykańskim)
Thomas
1
@thomas - Dobra uwaga. Edytowane teraz, aby sprecyzowaćCultureInfo.InvariantCulture
Andy
8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
IndieTech Solutions
To dla uzyskania AM / PM od daty. Ale jeśli chcę zmienić AM na PM w dowolnym terminie. Więc co powinienem zrobić ?
Ajay Sharma
2
@AjaySharma Wystarczy dodać 12 godzin przed oceną formatu. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM,
107
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

To powinno dać ci wartość ciągu czasu. tt powinien dołączyć am / pm.

Możesz także spojrzeć na pokrewny temat:

Jak uzyskać aktualną porę dnia?

XikiryoX
źródło
8
Powinna to być mała litera, hhponieważ twoja obecna reprezentacja wychodzi za 24 godziny z
Nie podobało mi się
1
@LukeMcGregor Poprawiłem odpowiedź zgodnie z twoją sugestią.
Doktor Jones
46

DateTimePowinny zawsze być wewnętrznie w „American” (gregoriańskiego) kalendarza. Jeśli tak

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

powinieneś dostać to, czego chcesz w wielu mniej liniach.

Xanatos
źródło
33

Bardzo prosty w użyciu formatu ciągu

na .ToSTring("") :

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

  • jeśli użyjesz „GG” - >> Godzina, przy użyciu 24-godzinnego zegara od 00 do 23.

  • jeśli dodasz „tt” - >> Desygnator 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, o co musisz dbać o coś innego to Kultura systemowa, ponieważ ten sam kod wykonywany w oknach z innym językiem, szczególnie z różnymi językami Język wygeneruje inny wynik z tym samym kodem

przykład okna ustawionego na arabską kulturę języka pokaże następująco:

// 23:12 م

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

w innym systemie kultura zależy od tego, co jest ustawione w opcjach regionalnych i językowych systemu Windows, wyświetli // 23:12 du.

możesz przełączać się między różnymi formatami w panelu sterowania Windows pod Windows regionalnym i językowym -> obecny format (combobox) i zmienić ... zastosuj to przebuduj (uruchom) aplikację i zobacz, o czym mówię.

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

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

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

i modyfikowanie poprzedniego kodu, aby wyglądał tak:

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 => przy użyciu domyślnego formatu angielskiego.

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

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

pokaże // 23:12 م

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

przykłady:

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

big list...

daj mi znać, jeśli masz inne pytanie.

Bilal
źródło
Jeśli chcę zobaczyć „23:12”? Myślę, że twoja odpowiedź jest niepełna.
Fjodr
18

Wiem, że może się to wydawać bardzo późno ... jednak może pomóc komuś tam

Chciałem uzyskać część AM rano, więc skorzystałem z tego, co poradził Andy:

dateTime.ToString("tt");

Użyłem tej części do zbudowania ścieżki do zapisywania moich plików. Zbudowałem moje założenia, że ​​dostanę rano lub po południu i nic więcej !!

jednak kiedy użyłem komputera, którego kultura nie jest angielska .. (w moim przypadku ARABIC) .. moja aplikacja nie powiodła się, ponieważ format „tt” zwrócił coś nowego, a nie AM ani PM (م lub ص) ..

Rozwiązaniem tego problemu było zignorowanie kultury poprzez dodanie drugiego argumentu w następujący sposób:

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

.. oczywiście musisz dodać: using System.Globalization; na górze pliku ur mam nadzieję, że to komuś pomoże :)

szukanie SO
źródło
3
Dziękujemy za dodanie tego, ponieważ pomogło mi to dzisiaj - dostawałem AM w moim środowisku deweloperskim i AM na zdalnym serwerze i nie było z nim ogromnej pomocy, dopóki nie przeczytałem tego postu. Nawet Dotnetpearls stwierdza: „Nie ma kropek w danych wyjściowych tt. Jeśli potrzebujesz kropek w AM lub PM, musisz manipulować łańcuchem”. Co oczywiście było całkowicie nieprawdziwe w moim przypadku ...
KiwiSunGoddess
13

to całkiem proste

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

Na przykład, ale istnieją lepsze sposoby formatowania daty i godziny.

Kevin Holditch
źródło
Zobacz link podany powyżej przez @ChrisF. Zasadniczo możesz użyć metody ToString na obiekcie datetime i przekazać mu format. W ten sposób nie wywołujesz datetime.ToString wiele razy, tak jak w przykładzie kodu.
Kevin Holditch
2
Choć może się to wydawać brzydkie, jest to o wiele prostszy i bardziej konsekwentny sposób niż mieszanie się z różnymi kulturami. Na przykład wiele kultur pokazuje czas w ciągu 24 godzin i wcale nie obejmuje AM / PM, a ToString („tt”) tworzy pusty ciąg.
nathanchere
4

Coś jak bool isPM = GetHour() > 11. Ale jeśli chcesz sformatować datę w ciągu, nie musisz tego robić sam. Użyj do tego funkcji formatowania daty .

CodesInChaos
źródło
1
Szczerze mówiąc, nie pokazałbym nawet metody isPM (). THe tylko sposób zasadnie wielkoformatowych obiektów DateTime korzysta z formatek.
richb01
@ richb01 Nie zgadzam się. Jedynym bezpiecznym sposobem jest w ogóle nie używanie am / pm i korzystanie z formatu 24h, zawsze dołączaj niezmienną kulturę lub rób to ręcznie. „am” i „pm” nie są wypełnione np. w języku niemieckim, są po prostu puste. Jeśli ktoś napisze String.Format ("{0: hh: mm tt}", DateTime.Now), po prostu popełniają błędne czasy
Christoph
1

Możesz to przetestować w ten sposób

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

Wynik będzie taki:

AM

lub

PM
Yazarloo
źródło
1
Czy wiesz, że używasz kodu akceptowanej odpowiedzi?
Thomas Ayoub
Drogi @ThomasAyoub, Napisany kod pochodzi z wiersza źródła mojego projektu. teraz działa.
yazarloo
Przepraszamy, to bardzo słaba odpowiedź, szczególnie dlatego, że wprowadzamNow
Wolf
0

Oto łatwiejszy sposób na napisanie formatu godziny (hh:mm:ss tt) i wyświetlenie go osobno, jeśli chcesz.

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

lub po prostu:

 DateTime.Now.ToString("hh:mm:ss tt")
Zero
źródło
0

@ Odpowiedź Andy'ego jest w porządku. Ale jeśli chcesz pokazać czas bez formatu 24-godzinnego, możesz postępować w ten sposób

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

Następnie powinieneś uzyskać czas jak „10:35:20 PM” lub „10:35:20 AM”

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

Oto przykładowy kod:

DateTime time = DateTime.Now;
string AM_PM;
AM_PM = time.ToLongTimeString().Substring(time.ToLongTimeString().Length - 2);
Praveen Manupati
źródło
2
To nie jest niezawodne rozwiązanie. ToLongTimeString()zwraca wartość na podstawie bieżącej kultury wątków. I w przeciwieństwie do niektórych podobnych rozwiązań podanych w innych odpowiedziach, ten kod nie będzie nawet działał, jeśli ustawisz kulturę wątków na InvariantCulture, ponieważ kultura niezmiennicza - LongTimePatternktóra determinuje wartość zwracaną ToLongTimeString()- jest HH:mm:ss.
Joe Farrell,