Bir DateTime öğesinden AM / PM değerini nasıl alabilirim?


204

Söz konusu kod aşağıdadır:

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

Değerden AM / PM'yi nasıl alabilirim dateTime?


24
A'yı biçimlendirmenin DateTimebundan daha iyi yolları vardır . Bkz msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF

Sadece kullanındateTime.ToString("tt");
David Jesus

Yanıtlar:


368

Nasıl olur:

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

3
Bu hakkı elde etmek için yeni System.Globalization.CultureInfo ("tr-US") eklemeniz gerekir (iş parçacığını zaten bir ABD bağlamında çalıştırmıyorsanız)
thomas

1
@ thomas - İyi bir nokta. Belirtmek için şimdi düzenlendiCultureInfo.InvariantCulture
Andy

8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
IndieTech Solutions

Bu tarihten itibaren AM / PM almak için. Ama eğer herhangi bir tarihte AM'yi PM olarak değiştirmek istersem. O zaman ne yapmalıyım?
Ajay Sharma

2
@AjaySharma Biçim değerlendirmesinden 12 saat önce ekleyin. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM

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

Bu size zamanın dize değerini vermelidir. am / pm eklemelidir.

İlgili konuya da bakabilirsiniz:

Günün saatini nasıl alırsınız?


8
Bu olmak küçük harf olmalıdır hhbiraz anlamsız olduğu am ve pm ile 24 saat zamanlı olarak geçerli temsil çıkışları olarak
Değil sevilen

1
@LukeMcGregor Cevabınızı öneriniz doğrultusunda değiştirdim.
Doktor Jones

46

Her DateTimezaman dahili olarak "amerikan" (Gregoryen) takviminde olmalıdır. Yani eğer yaparsan

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

istediğinizi daha az satırda almalısınız.


33

Dize biçimini kullanarak çok basit

üzerinde .ToSTring("") :

  • "hh" - >> kullanıyorsanız Saat, 01'den 12'ye 12 saatlik bir saat kullanarak.

  • "HH" kullanıyorsanız - >> Saat, 00 ile 23 arasında 24 saatlik bir saat kullanır.

  • "tt" eklerseniz - >> Am / Pm belirleyicisi.

23:12 - 11:12 Pm arasında dönüştürme örneği:

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

bir saniye beklemek başka bir şey hakkında ihtiyacınız olmayan sistem Kültürü çünkü diğer kod ile özellikle farklı kültür langage ile pencerelerde yürütülen aynı kod aynı kod ile farklı sonuç üretecektir

Arapça langage kültürüne ayarlanmış pencerelerin örneği şu şekilde gösterilecektir:

// 23:12 م

م Akşam anlamına gelir (مساء 'nın ilk hanesi).

başka bir sistem kültüründe windows bölgesel ve dil seçeneği ne ayarlanır bağlıdır, gösterecektir // 23:12 du.

Windows bölgesel ve dil altında Windows kontrol panelinde farklı biçim arasında geçiş yapabilirsiniz -> geçerli biçim (combobox) ve değiştir ... uygula, uygulamanızı yeniden oluştur (yürüt) yap ve neden bahsettiğimi izle.

peki mevcut sistemin kültürü İngilizce olarak ayarlanmamışsa, Am ve Pm Kelimelerini İngilizce etkinliğinde kimi zorlayabilirim?

sadece iki satır ekleyerek kolay: ->

ilk adım using System.Globalization;kodunuzun üstüne ekleyin

ve Önceki kodun şu şekilde değiştirilmesi:

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 => varsayılan İngilizce Biçimini kullanarak.

başka bir soru, pencereleri İngilizce (veya başka bir dil) bölgesel biçimde ayarlamış olsam bile, pm'nin Arapça veya belirli bir dilde olmasını istiyorum?

Arapça Örneklem için Çözüm:

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

Bu gösterecek // 23:12 م

sistemim bir İngiliz bölgesi biçimine ayarlanmışsa. başka bir dil biçimini istiyorsanız "ar-AE" yi değiştirebilirsiniz. her dilin bir listesi ve formatı vardır.

örnekler:

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

big list...

başka bir sorunuz olursa bana bildirin.


"23:12" i görmek istersem? Bence cevabınız eksik.
Fjodr

18

Biliyorum bu çok geç kalmış gibi görünebilir .. ancak orada birine yardımcı olabilir

Ben AM PM tarihin bir parçası almak istedim, bu yüzden Andy tavsiye ne kullanılır:

dateTime.ToString("tt");

Bu bölümü dosyalarımı kaydetmek için bir Yol oluşturmak için kullanılır .. Ben AM veya PM ya da başka bir şey alacağım varsayımlarımı inşa !!

Ancak kültürü İngilizce olmayan bir bilgisayar kullandığımda .. (benim durumumda ARABIC) .. benim uygulama başarısız oldu biçimi "tt" AM veya PM (م veya ص) değil yeni bir şey döndü ..

Bunun çözümü, ikinci argümanı aşağıdaki gibi ekleyerek kültürü görmezden gelmekti:

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

.. tabii u eklemek zorunda: System.Globalization kullanarak; ur dosya üstünde umarım birine yardımcı olur :)


3
Bugün bana yardımcı olduğu için bunu eklediğiniz için teşekkür ederim - geliştirici ortamımda AM ve uzak sunucuda AM alıyordum ve bu yazıyı okuyana kadar google'dan çok fazla yardım yoktu. Dotnetpearls bile "tt'nin çıkışında hiçbir dönem yoktur. AM veya PM'nizde noktalara gereksinim duyarsanız, dizeyi değiştirmek zorunda kalırsınız." Tabii ki benim durumumda tamamen yanlış ...
KiwiSunGoddess

13

oldukça basit

  Date someDate = new DateTime();
  string timeOfDay = someDate.ToString("hh:mm tt"); 
  // hh - shows hour and mm - shows minute - tt - shows AM or PM

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

Örneğin, ancak tarih saatini biçimlendirmenin daha iyi yolları vardır.


@ChrisF'in yukarıda verdiği bağlantıya bakın. Temel olarak datetime nesnesindeki ToString yöntemini kullanabilir ve ona bir biçim verebilirsiniz. Bu şekilde datetime.ToString kod örneğinde yaptığınız gibi çoklu süreleri çağırmazsınız.
Kevin Holditch

2
Bu çirkin göründüğü kadarıyla, farklı kültürlerle uğraşmaktan çok daha basit ve daha tutarlı bir yoldur. Örneğin, birçok kültür 24 saat içinde zaman gösterir ve hiç AM / PM içermez ve ToString ("tt") boş bir dize oluşturur.
nathanchere


4

Gibi bir şey bool isPM = GetHour() > 11. Ancak bir tarihi bir dizeye biçimlendirmek istiyorsanız, bunu kendiniz yapmanız gerekmez. Bunun için tarih biçimlendirme işlevlerini kullanın .


1
Dürüst olmak gerekirse, isPM () yöntemini bile göstermezdim. Sadece meşru biçim DateTime nesnelere yolu biçemleyicileri kullanıyor.
richb01

@ richb01 Kabul etmiyorum. Tek güvenli yol hiç am / pm kullanmak ve 24 saat formatını kullanmak değil, her zaman değişmez kültürü eklemek veya manuel olarak yapmaktır. "am" ve "pm" örneğin Almanca dilinde doldurulmamış, sadece boş. Birisi String.Format ("{0: ss: dd tt}", DateTime.Now)
Christoph

1

Bu şekilde test edebilirsiniz

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

Çıktı şu şekilde olacaktır:

AM

veya

PM

1
Kabul edilen cevabın kodunu kullandığınızı biliyor musunuz?
Thomas Ayoub

Sayın @ThomasAyoub, Yazılan kod proje kaynağımın bir satırından. şu anda çalışıyor.
yazarloo

Üzgünüm, bu çok kötü bir cevap, özellikle de tanıtıyor çünküNow
Wolf

0

İsterseniz saat biçimini yazmanın (hh:mm:ss tt)ve bunları ayrı ayrı görüntülemenin daha kolay bir yolu .

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

ya da sadece:

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

0

@ Andy'nin cevabı tamam. Ancak 24 saat formatı olmadan zaman göstermek istiyorsanız, bu şekilde takip edebilirsiniz

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

Bundan sonra, "10:35:20 PM" veya "10:35:20 AM" gibi zaman almalısınız.


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

-2

İşte bazı örnek kod:

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

2
Bu güvenilir bir çözüm değil. ToLongTimeString()geçerli iş parçacığı kültürüne dayalı bir değer döndürür. Ve diğer yanıtlar verilen benzer çözümlerden bazıları aksine, bu kodu, size iplik kültürü ayarlanmış değilse bile iş InvariantCulture, çünkü sabit kültür en LongTimePatterndönüş değeri belirleyen şey bu -ki ToLongTimeString()-is HH:mm:ss.
Joe Farrell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.