Bagaimana cara saya mendapatkan nilai AM / PM dari DateTime?

204

Kode yang dimaksud adalah di bawah ini:

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

bagaimana saya bisa mendapatkan AM / PM dari dateTimenilai?

SilverLight
sumber
24
Ada cara yang jauh lebih baik untuk memformat DateTimedari ini. Lihat msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF
Cukup gunakandateTime.ToString("tt");
David Jesus

Jawaban:

368

Bagaimana tentang:

dateTime.ToString("tt", CultureInfo.InvariantCulture);
Andy
sumber
3
Anda perlu menambahkan System.Globalization.CultureInfo ("en-US") baru untuk mendapatkan hak ini (jika Anda belum menjalankan utas dalam konteks AS)
thomas
1
@ Thomas - Poin yang bagus. Diedit sekarang untuk menentukanCultureInfo.InvariantCulture
Andy
8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
Solusi IndieTech
Ini untuk mendapatkan AM / PM dari tanggal. Tetapi jika saya ingin mengubah AM ke PM di tanggal berapa pun. Lalu apa yang harus saya lakukan?
Ajay Sharma
2
@AjaySharma Cukup tambahkan 12 jam sebelum evaluasi format. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM
107
string.Format("{0:hh:mm:ss tt}", DateTime.Now)

Ini akan memberi Anda nilai string waktu. Seharusnya menambahkan am / pm.

Anda juga dapat melihat topik terkait:

Bagaimana Anda mendapatkan waktu hari ini?

XikiryoX
sumber
8
Ini harus menjadi huruf kecil hhkarena representasi Anda saat ini menghasilkan dalam 24 jam waktu dengan am dan pm yang agak tidak berguna
Tidak dicintai
1
@LukeMcGregor Saya telah mengubah jawaban sesuai saran Anda.
Dokter Jones
46

The DateTimeharus selalu secara internal dalam "Amerika" (Gregorian) kalender. Jadi, jika Anda melakukannya

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

Anda harus mendapatkan apa yang Anda inginkan dalam banyak baris.

xanatos
sumber
33

Sangat sederhana dengan menggunakan format string

di .ToSTring("") :

  • jika Anda menggunakan "hh" - >> Jam, menggunakan jam 12 jam dari 01 hingga 12.

  • jika Anda menggunakan "HH" - >> Jam, menggunakan jam 24 jam dari 00 hingga 23.

  • jika Anda menambahkan "tt" - >> The Am / Pm designator.

contoh konversi dari 23:12 ke 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();

tunggu sebentar yang tidak semua Anda perlu peduli tentang sesuatu yang lain adalah sistem Budaya karena kode yang sama dijalankan pada windows dengan bahasa lainnya terutama dengan bahasa budaya difrent akan menghasilkan hasil difrent dengan kode yang sama

contoh windows diatur ke budaya bahasa Arab akan menunjukkan seperti itu:

// 23:12 م

م berarti Evening (kata pertama dari مساء).

dalam budaya sistem lain tergantung pada apa yang diatur pada windows regional dan opsi bahasa, ia akan menampilkan // 23:12 du.

Anda dapat mengubah antara berbagai format pada panel kontrol windows di bawah windows regional dan bahasa -> format saat ini (kotak kombo) dan mengubah ... menerapkannya melakukan membangun kembali (mengeksekusi) aplikasi Anda dan menonton apa yang saya bicarakan.

jadi siapa yang bisa saya paksa tampilkan Kata Am dan Pm dalam acara Bahasa Inggris jika budaya sistem saat ini tidak disetel ke Bahasa Inggris?

mudah hanya dengan menambahkan dua baris: ->

langkah pertama tambahkan using System.Globalization;di atas kode Anda

dan mengubah kode Sebelumnya menjadi seperti ini:

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 => menggunakan Format Bahasa Inggris default.

pertanyaan lain saya ingin memiliki pm dalam bahasa Arab atau bahasa tertentu, bahkan jika saya menggunakan windows diatur ke bahasa Inggris (atau bahasa lain) format regional?

Contoh untuk Contoh Bahasa Arab:

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

ini akan menunjukkan // 23:12 م

acara jika sistem saya diatur ke format wilayah Inggris. Anda dapat mengubah "ar-AE" jika Anda ingin format bahasa lain. ada daftar setiap bahasa dan formatnya.

contoh:

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

big list...

beri tahu saya jika Anda memiliki pertanyaan lain.

Bilal
sumber
Jika saya ingin melihat "11:12 PM"? Saya pikir jawaban Anda tidak lengkap.
Fjodr
18

Saya tahu ini mungkin tampak sangat terlambat .. namun mungkin membantu seseorang di luar sana

Saya ingin mendapatkan bagian AM PM dari tanggal tersebut, jadi saya menggunakan apa yang disarankan Andy:

dateTime.ToString("tt");

Saya menggunakan bagian itu untuk membuat Path untuk menyimpan file saya .. Saya membuat asumsi bahwa saya akan mendapatkan AM atau PM dan tidak ada yang lain !!

namun ketika saya menggunakan PC yang budayanya bukan bahasa Inggris .. (dalam kasus saya ARABIC) .. aplikasi saya gagal karena format "tt" mengembalikan sesuatu yang baru bukan AM atau PM (م atau ص) ..

Jadi perbaikan untuk ini adalah dengan mengabaikan budaya dengan menambahkan argumen kedua sebagai berikut:

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

.. tentu saja Anda harus menambahkan: using System.Globalization; di atas file ur saya harap itu akan membantu seseorang :)

mencariJadi
sumber
3
Terima kasih telah menambahkan ini karena ini membantu saya hari ini - saya mendapatkan AM di lingkungan dev saya dan AM di server jarak jauh dan tidak ada banyak bantuan dari google untuk itu sampai saya membaca posting ini. Bahkan Dotnetpearls menyatakan, "Tidak ada periode dalam output tt. Jika Anda memerlukan periode dalam AM atau PM Anda, Anda harus memanipulasi string." Yang tentu saja benar-benar tidak benar dalam kasus saya ...
KiwiSunGoddess
13

ini cukup sederhana

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

Sebagai contoh Anda tetapi ada cara yang lebih baik untuk memformat datetime.

Kevin Holditch
sumber
Lihat tautan yang diberikan @ChrisF di atas. Pada dasarnya Anda dapat menggunakan metode ToString pada objek datetime dan memberikannya format. Dengan cara ini Anda tidak memanggil datetime. Melacak waktu mulitple seperti yang Anda lakukan dalam contoh kode Anda.
Kevin Holditch
2
Walaupun ini tampak jelek, itu adalah cara yang jauh lebih sederhana dan lebih konsisten daripada bermain-main dengan budaya yang berbeda. Misalnya banyak budaya menunjukkan waktu dalam 24 jam dan tidak termasuk AM / PM sama sekali, dan ToString ("tt") menghasilkan string kosong.
nathanchere
4

Sesuatu seperti bool isPM = GetHour() > 11. Tetapi jika Anda ingin memformat tanggal ke string, Anda tidak perlu melakukan ini sendiri. Gunakan fungsi format tanggal untuk itu.

CodesInChaos
sumber
1
Jujur, saya bahkan tidak akan menunjukkan metode isPM (). Satu- satunya cara untuk memformat objek DateTime secara sah adalah dengan menggunakan pemformat.
richb01
@ richb01 Saya tidak setuju. Satu-satunya cara yang aman adalah tidak menggunakan am / pm sama sekali dan menggunakan format 24jam, selalu menambahkan budaya invarian atau melakukannya secara manual. "am" dan "pm" tidak diisi misalnya dalam bahasa Jerman, hanya kosong. Jika seseorang menulis String.Format ("{0: hh: mm tt}", DateTime.Now) mereka hanya mendapatkan waktu yang salah
Christoph
1

Anda dapat mengujinya dengan cara ini

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

Outputnya akan seperti ini:

AM

atau

PM
yazarloo
sumber
1
Apakah Anda sadar bahwa Anda menggunakan kode jawaban yang diterima?
Thomas Ayoub
Dear @ThomasAyoub, Kode yang ditulis berasal dari garis sumber proyek saya. itu berfungsi sekarang.
yazarloo
Maaf, ini adalah jawaban yang sangat buruk, terutama karena memperkenalkanNow
Wolf
0

Ini adalah cara yang lebih mudah untuk menulis format waktu (hh:mm:ss tt)dan menampilkannya secara terpisah jika diinginkan.

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

atau cukup dengan:

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

@ Jawaban Andy baik-baik saja. Tetapi jika Anda ingin menunjukkan waktu tanpa format 24 jam maka Anda dapat mengikuti seperti ini

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

Setelah itu, Anda harus mendapatkan waktu seperti "10:35:20" atau "10:35:20"

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

Berikut beberapa contoh kode:

DateTime time = DateTime.Now;
string AM_PM;
AM_PM = time.ToLongTimeString().Substring(time.ToLongTimeString().Length - 2);
Praveen Manupati
sumber
2
Ini bukan solusi yang andal. ToLongTimeString()mengembalikan nilai berdasarkan budaya utas saat ini. Dan tidak seperti beberapa solusi serupa yang diberikan dalam jawaban lain, kode ini bahkan tidak akan berfungsi jika Anda mengatur kultur utas InvariantCulture, karena kultur invarian LongTimePattern— yang menentukan nilai kembalinya ToLongTimeString()— adalah HH:mm:ss.
Joe Farrell