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?


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

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?


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.


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.


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 :)


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

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

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


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.


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

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

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"


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

-2

Berikut beberapa contoh kode:

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.