ฉันจะรับค่า AM / PM จาก DateTime ได้อย่างไร


204

รหัสในคำถามด้านล่าง:

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

ฉันจะรับ AM / PM จากdateTimeค่าได้อย่างไร


24
มีวิธีที่ดีกว่าในการจัดรูปแบบDateTimeมากกว่านี้ ดูmsdn.microsoft.com/en-us/library/8kb3ddd4.aspx
ChrisF

เพียงแค่ใช้dateTime.ToString("tt");
David Jesus

คำตอบ:


368

เกี่ยวกับ:

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

3
คุณต้องเพิ่ม System.Globalization.CultureInfo ใหม่ ("en-US") เพื่อให้ได้รับสิทธินี้ (ถ้าคุณยังไม่ได้ใช้งานเธรดในบริบทของสหรัฐอเมริกา)
thomas

1
@thomas - จุดดี แก้ไขตอนนี้เพื่อระบุCultureInfo.InvariantCulture
Andy

8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
โซลูชั่น IndieTech

สิ่งนี้เพื่อรับ AM / PM จากวันที่ แต่ถ้าฉันต้องการเปลี่ยน AM เป็น PM ในวันใดก็ได้ ถ้าอย่างนั้นฉันควรทำยังไงดี?
Ajay Sharma

2
@AjaySharma เพียงเพิ่ม 12 ชั่วโมงก่อนการประเมินรูปแบบ DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM

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

สิ่งนี้จะทำให้คุณมีค่าสตริงของเวลา tt ควรเพิ่ม am / pm ต่อท้าย

คุณสามารถดูหัวข้อที่เกี่ยวข้อง:

คุณจะได้รับเวลาปัจจุบันของวันได้อย่างไร


8
นี่ควรเป็นตัวพิมพ์เล็กhhเพราะผลลัพธ์ที่คุณได้รับในปัจจุบันเป็น 24 ชั่วโมงด้วยเวลา am และ pm ซึ่งไม่มีประโยชน์เลย
ไม่เป็นที่รัก

1
@LukeMcGregor ฉันได้แก้ไขคำตอบตามที่คุณแนะนำ
หมอโจนส์

46

DateTimeควรจะเป็นภายในใน "อเมริกัน" (เกรกอเรียน) ปฏิทิน ดังนั้นหากทำ

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

คุณควรได้สิ่งที่คุณต้องการในบรรทัดที่น้อยลง


33

ง่ายมากโดยใช้รูปแบบสตริง

บน .ToSTring("") :

  • ถ้าคุณใช้ "hh" - >> ชั่วโมงโดยใช้นาฬิกาแบบ 12 ชั่วโมงตั้งแต่ 01 ถึง 12

  • ถ้าคุณใช้ "HH" - >> ชั่วโมงโดยใช้นาฬิกา 24 ชั่วโมงจาก 00 ถึง 23

  • ถ้าคุณเพิ่ม "tt" - >> ตัวกำหนด Am / Pm

ยกตัวอย่างการเปลี่ยนจาก 23:12 เป็น 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();

รอสักครู่ที่ไม่ใช่ทั้งหมดที่คุณต้องใส่ใจเกี่ยวกับสิ่งอื่นคือระบบวัฒนธรรมเพราะรหัสเดียวกันที่ดำเนินการบน windows กับภาษาอื่น ๆ โดยเฉพาะกับภาษาที่แตกต่างกันจะสร้างผลลัพธ์ที่แตกต่างด้วยรหัสเดียวกัน

ตัวอย่างหน้าต่างที่ตั้งค่าเป็นวัฒนธรรมการใช้ภาษาอาหรับจะแสดงดังนี้:

// 23:12 م

مหมายถึงค่ำ (leter แรกของمساء)

ในวัฒนธรรมของระบบอื่นขึ้นอยู่กับสิ่งที่ตั้งค่าในตัวเลือกภูมิภาคและภาษาของ windows มันจะแสดง // 23:12 du

คุณสามารถเปลี่ยนรูปแบบที่แตกต่างกันบนแผงควบคุม windows ภายใต้ windows region และ language -> รูปแบบปัจจุบัน (combobox) และ change ... ใช้มันทำการ rebuild (execute) ของแอพของคุณและดูสิ่งที่เอมี่กำลังพูดถึง

ดังนั้นใครสามารถบังคับให้แสดงคำ Am และ Pm ในเหตุการณ์ภาษาอังกฤษหากวัฒนธรรมของระบบปัจจุบันไม่ได้ถูกตั้งค่าเป็นภาษาอังกฤษ

ง่ายเพียงแค่เพิ่มสองบรรทัด: ->

ขั้นตอนแรกจะเพิ่มusing System.Globalization;ที่ด้านบนของรหัสของคุณ

และแก้ไขรหัสก่อนหน้าให้เป็นดังนี้:

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 => ใช้รูปแบบภาษาอังกฤษเริ่มต้น

คำถามอื่นที่ฉันต้องการให้ pm เป็นภาษาอาหรับหรือภาษาที่เฉพาะเจาะจงแม้ว่าฉันใช้ windows ตั้งค่าเป็นรูปแบบภูมิภาคของภาษาอังกฤษ (หรือภาษาอื่น)?

Soution สำหรับตัวอย่างภาษาอาหรับ:

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

สิ่งนี้จะแสดง // 23:12 م

เหตุการณ์หากระบบของฉันถูกตั้งค่าเป็นรูปแบบภูมิภาคของอังกฤษ คุณสามารถเปลี่ยน "ar-AE" หากคุณต้องการรูปแบบภาษาอื่น มีรายการของแต่ละภาษาและรูปแบบของมัน

ตัวอย่าง:

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

big list...

ทำให้ฉันรู้ว่าคุณมีคำถามอื่น


หากฉันต้องการดู "11:12 PM" ฉันคิดว่าคำตอบของคุณไม่สมบูรณ์
Fjodr

18

ฉันรู้ว่ามันอาจจะช้าไปหน่อย .. แต่มันอาจช่วยใครซักคนที่นั่น

ฉันต้องการรับ AM PM เป็นส่วนหนึ่งของวันที่ดังนั้นฉันจึงใช้สิ่งที่ Andy แนะนำ:

dateTime.ToString("tt");

ฉันใช้ส่วนนั้นเพื่อสร้าง Path เพื่อบันทึกไฟล์ของฉัน .. ฉันสร้างสมมติฐานของฉันขึ้นมาว่าฉันจะได้ทั้ง AM หรือ PM และไม่มีอะไรอีก !!

อย่างไรก็ตามเมื่อฉันใช้พีซีที่มีวัฒนธรรมไม่ใช่ภาษาอังกฤษ .. (ในกรณีของฉัน ARABIC) .. แอปพลิเคชันของฉันล้มเหลวเนื่องจากรูปแบบ "tt" ส่งคืนสิ่งใหม่ไม่ใช่ AM หรือ PM (مหรือص) ..

ดังนั้นการแก้ไขในเรื่องนี้คือการไม่สนใจวัฒนธรรมด้วยการเพิ่มอาร์กิวเมนต์ที่สองดังนี้

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

.. แน่นอนคุณต้องเพิ่ม: using System.Globalization; ด้านบนของไฟล์ ur ฉันหวังว่าจะช่วยใครบางคน :)


3
ขอบคุณที่เพิ่มสิ่งนี้เพราะมันช่วยฉันในวันนี้ - ฉันได้รับ AM จากสภาพแวดล้อม dev และ AM ของฉันบนเซิร์ฟเวอร์ระยะไกลและไม่มีความช่วยเหลือจำนวนมากจาก google ด้วยจนกระทั่งฉันอ่านโพสต์นี้ แม้แต่ Dotnetpearls ก็ระบุว่า "ไม่มีจุดในเอาต์พุตของ tt หากคุณต้องการจุดใน AM หรือ PM ของคุณคุณจะต้องจัดการกับสตริง" ซึ่งแน่นอนว่าไม่จริงในกรณีของฉัน ...
KiwiSunGoddess

13

มันค่อนข้างง่าย

  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"

สำหรับตัวอย่างของคุณ แต่มีวิธีที่ดีกว่าในการจัดรูปแบบวันที่และเวลา


ดูลิงค์ที่ @ChrisF ได้ให้ไว้ข้างต้น โดยทั่วไปคุณสามารถใช้วิธี ToString บนวัตถุ datetime และส่งผ่านรูปแบบ วิธีนี้คุณจะไม่เรียก datetime.ToString เวลา mulitple ตามที่คุณทำในตัวอย่างโค้ดของคุณ
Kevin Holditch

2
น่าเกลียดอย่างที่เห็นนี่เป็นวิธีที่ง่ายกว่าและมีความสอดคล้องมากกว่าที่จะมายุ่งเกี่ยวกับวัฒนธรรมที่แตกต่าง ตัวอย่างเช่นหลายวัฒนธรรมแสดงเวลาใน 24 ชั่วโมงและไม่รวม AM / PM เลยและ ToString ("tt") จะสร้างสตริงว่าง
nathanchere


4

bool isPM = GetHour() > 11สิ่งที่ชอบ แต่ถ้าคุณต้องการจัดรูปแบบวันที่เป็นสตริงคุณไม่จำเป็นต้องทำด้วยตัวเอง ใช้ฟังก์ชั่นการจัดรูปแบบวันที่


1
สุจริตฉันจะไม่แสดงวิธี isPM () THe เพียงวิธีการวัตถุ DateTime รูปแบบถูกต้องตามกฎหมายคือการใช้ formatters จะถูก
richb01

@ richb01 ฉันไม่เห็นด้วย วิธีเดียวที่ปลอดภัยคือไม่ใช้ am / pm เลยและใช้รูปแบบ 24 ชั่วโมงผนวกวัฒนธรรมที่ไม่เปลี่ยนแปลงหรือทำด้วยตนเองเสมอ "am" และ "pm" ไม่ได้ถูกเติมเช่นในภาษาเยอรมันมันว่างเปล่า หากใครบางคนเขียน String.Format ("{0: hh: mm tt}", DateTime.Now) พวกเขาจะได้รับเวลาที่ผิด
Christoph

1

คุณสามารถทดสอบด้วยวิธีนี้

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

ผลลัพธ์จะเป็นดังนี้:

AM

หรือ

PM

1
คุณรู้หรือไม่ว่าคุณกำลังใช้รหัสของคำตอบที่ยอมรับได้?
โทมัส Ayoub

เรียน @ThomasAyoub รหัสที่เขียนนั้นมาจากบรรทัดของแหล่งข้อมูลโครงการของฉัน มันใช้งานได้แล้ว
yazarloo

ขออภัยนี่เป็นคำตอบที่แย่มากโดยเฉพาะการแนะนำNow
Wolf

0

นี่คือวิธีที่ง่ายกว่าที่คุณสามารถเขียนรูปแบบเวลา(hh:mm:ss tt)และแสดงแยกต่างหากหากคุณต้องการ

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

หรือเพียงแค่:

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

0

@ คำตอบของ Andy คือโอเค แต่ถ้าคุณต้องการแสดงเวลาที่ไม่มีรูปแบบ 24 ชั่วโมงคุณอาจทำตามวิธีนี้

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

หลังจากนั้นคุณควรได้เวลาเช่น "10:35:20 PM" หรือ "10:35:20 AM"



-2

นี่คือตัวอย่างรหัส:

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

2
นี่ไม่ใช่วิธีการแก้ปัญหาที่เชื่อถือได้ ToLongTimeString()ส่งคืนค่าตามวัฒนธรรมเธรดปัจจุบัน และแตกต่างจากโซลูชันที่คล้ายกันที่ให้ในคำตอบอื่น ๆ รหัสนี้จะไม่ทำงานถ้าคุณตั้งวัฒนธรรมเธรดเป็นInvariantCultureเพราะวัฒนธรรมที่ไม่เปลี่ยนแปลงของLongTimePattern- ซึ่งเป็นสิ่งที่กำหนดค่าตอบแทนของToLongTimeString()- HH:mm:ssมัน
Joe Farrell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.