Làm cách nào để tôi nhận được giá trị AM / PM từ DateTime?


204

Mã trong câu hỏi là dưới đây:

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

Làm thế nào tôi có thể nhận được AM / PM từ dateTimegiá trị?


24
Có nhiều cách tốt hơn để định dạng a DateTimehơn thế này. Xem msdn.microsoft.com/en-us/l Library / 8kb3ddd4.aspx
ChrisF

Chỉ cần sử dụngdateTime.ToString("tt");
David Jesus

Câu trả lời:


368

Làm thế nào về:

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

3
Bạn cần thêm System.Globalization mới.CultInfo ("en-US") để có quyền này (nếu bạn chưa chạy chuỗi trong ngữ cảnh ở Hoa Kỳ)
thomas

1
@thomas - Điểm tốt. Chỉnh sửa ngay để chỉ địnhCultureInfo.InvariantCulture
Andy

8
ToString("tt", System.Globalization.CultureInfo.InvariantCulture)
Giải pháp IndieTech

Điều này để có được AM / PM từ ngày. Nhưng nếu tôi muốn đổi AM thành PM vào bất kỳ ngày nào. Vậy thì tôi phải làm sao?
Ajay Sharma

2
@AjaySharma Chỉ cần thêm 12 giờ trước khi đánh giá định dạng. DateTime.Now.AddHours(12).ToString("tt", CultureInfo.InvariantCulture)
AXMIM

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

Điều này sẽ cung cấp cho bạn giá trị chuỗi của thời gian. tt nên nối thêm sáng / chiều.

Bạn cũng có thể nhìn vào chủ đề liên quan:

Làm thế nào để bạn có được thời gian hiện tại trong ngày?


8
Điều này nên là trường hợp thấp hơn hhvì kết quả đại diện hiện tại của bạn trong 24 giờ với sáng và chiều là một chút vô nghĩa
Không được yêu thích vào

1
@LukeMcGregor Tôi đã sửa đổi câu trả lời theo đề xuất của bạn.
Bác sĩ Jones

46

Các DateTimenên luôn luôn có trong nội bộ "American" (Gregorian) dương lịch. Vì vậy, nếu bạn làm

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

bạn sẽ nhận được những gì bạn muốn trong nhiều dòng ít hơn.


33

Rất đơn giản bằng cách sử dụng định dạng chuỗi

trên .ToSTring("") :

  • nếu bạn sử dụng "hh" - >> Giờ, sử dụng đồng hồ 12 giờ từ 01 đến 12.

  • nếu bạn sử dụng "HH" - >> Giờ, sử dụng đồng hồ 24 giờ từ 00 đến 23.

  • nếu bạn thêm "tt" - >> Trình chỉ định Am / Pm.

ví dụ chuyển đổi từ 23:12 sang 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();

Đợi một chút, đó không phải là tất cả những gì bạn cần quan tâm đến thứ khác là Văn hóa hệ thống bởi vì cùng một mã được thực thi trên các cửa sổ với các ngôn ngữ khác, đặc biệt là langage văn hóa khác nhau sẽ tạo ra kết quả khác nhau với cùng một mã

Ví dụ về các cửa sổ được đặt thành văn hóa langage Ả Rập sẽ hiển thị như sau:

// 23:12

م có nghĩa là buổi tối (leter đầu tiên của مساء).

trong một nền văn hóa hệ thống khác phụ thuộc vào những gì được đặt trên cửa sổ tùy chọn khu vực và ngôn ngữ, nó sẽ hiển thị // 23:12 du.

bạn có thể thay đổi giữa các định dạng khác nhau trên bảng điều khiển windows theo khu vực và ngôn ngữ của windows -> định dạng hiện tại (combobox) và thay đổi ... áp dụng nó để xây dựng lại (thực thi) ứng dụng của bạn và xem những gì tôi đang nói.

vậy tôi có thể ép ai hiển thị từ Am và Pm trong tiếng Anh nếu văn hóa của hệ thống hiện tại không được đặt thành tiếng Anh?

dễ dàng chỉ bằng cách thêm hai dòng: ->

bước đầu tiên thêm using System.Globalization;vào đầu mã của bạn

và sửa đổi mã trước đó để được như thế này:

DateTime d = new DateTime(1, 1, 1, 23, 12, 0);
var res = d.ToString("HH:mm tt", CultureInfo.InvariantCulture); // this show  11:12 Pm

InvariantCARM => sử dụng Định dạng tiếng Anh mặc định.

một câu hỏi khác tôi muốn có chiều để bằng tiếng Ả Rập hoặc ngôn ngữ cụ thể, ngay cả khi tôi sử dụng các cửa sổ được đặt thành định dạng khu vực tiếng Anh (hoặc ngôn ngữ khác)?

Soution cho tiếng Ả Rập Exemple:

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

cái này sẽ hiển thị // 23:12 م

sự kiện nếu hệ thống của tôi được đặt ở định dạng tiếng Anh. bạn có thể thay đổi "ar-AE" nếu bạn muốn định dạng ngôn ngữ khác. có một danh sách của mỗi ngôn ngữ và định dạng của nó.

mẫu mực:

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

big list...

làm cho tôi biết nếu bạn có một câu hỏi khác.


Nếu tôi muốn xem "11:12 PM"? Tôi nghĩ rằng câu trả lời của bạn là không đầy đủ.
Fjodr

18

Tôi biết điều này có vẻ rất muộn .. tuy nhiên nó có thể giúp được ai đó ngoài kia

Tôi muốn có được phần AM PM của ngày này, vì vậy tôi đã sử dụng những gì Andy khuyên:

dateTime.ToString("tt");

Tôi đã sử dụng phần đó để xây dựng Đường dẫn để lưu các tệp của mình .. Tôi đã xây dựng các giả định của mình rằng tôi sẽ nhận được AM hoặc PM và không có gì khác !!

tuy nhiên khi tôi sử dụng PC mà văn hóa của nó không phải là tiếng Anh .. (trong trường hợp của tôi là ARABIC) .. ứng dụng của tôi không thành công do định dạng "tt" trả về một cái gì đó mới không phải AM cũng không phải PM (م hoặc) ..

Vì vậy, cách khắc phục vấn đề này là bỏ qua văn hóa bằng cách thêm đối số thứ hai như sau:

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

.. tất nhiên bạn phải thêm: sử dụng System.Globalization; trên đầu tập tin của bạn, tôi hy vọng điều đó sẽ giúp được ai đó :)


3
Cảm ơn vì đã thêm nó vì nó đã giúp tôi ngày hôm nay - Tôi đã nhận được AM trên môi trường dev của tôi và AM trên máy chủ từ xa và không có một lượng trợ giúp lớn nào từ google cho đến khi tôi đọc bài đăng này. Ngay cả Dotnetpearls cũng tuyên bố "Không có dấu chấm trong đầu ra của tt. Nếu bạn yêu cầu các khoảng thời gian trong AM hoặc PM, bạn sẽ phải thao tác chuỗi." Điều đó tất nhiên là hoàn toàn sai sự thật trong trường hợp của tôi ...
KiwiSunGoddess 22/03/2015

13

nó khá đơn giản

  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"

Ví dụ của bạn nhưng có nhiều cách tốt hơn để định dạng datetime.


Xem liên kết mà @ChrisF đã đưa ra ở trên. Về cơ bản, bạn có thể sử dụng phương thức ToString trên đối tượng datetime và truyền cho nó một định dạng. Bằng cách này, bạn không gọi datetime.ToString mulitple lần như bạn đang làm trong ví dụ mã của mình.
Kevin Holditch

2
Xấu xí như điều này có vẻ như, nó là một cách đơn giản và nhất quán hơn nhiều so với việc làm rối tung các nền văn hóa khác nhau. Ví dụ, nhiều nền văn hóa hiển thị thời gian trong 24 giờ và hoàn toàn không bao gồm AM / PM và ToString ("tt") tạo ra một chuỗi trống.
nathanchere


4

Một cái gì đó như bool isPM = GetHour() > 11. Nhưng nếu bạn muốn định dạng một ngày thành một chuỗi, bạn không cần phải tự làm điều này. Sử dụng các chức năng định dạng ngày cho điều đó.


1
Thành thật mà nói, tôi thậm chí sẽ không hiển thị phương thức isPM (). THe chỉ cách để đối tượng DateTime định dạng hợp pháp được sử dụng và định dạng.
richb01

@ richb01 Tôi không đồng ý. Cách an toàn duy nhất là không sử dụng sáng / chiều và sử dụng định dạng 24h, luôn nối thêm văn hóa bất biến hoặc thực hiện thủ công. "am" và "pm" không được điền vào, ví dụ như trong tiếng Đức, nó chỉ trống rỗng. Nếu ai đó viết String.Format ("{0: hh: mm tt}", DateTime. Bây giờ) họ chỉ đơn giản là nhận sai lần
Christoph

1

Bạn có thể kiểm tra nó theo cách này

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

Đầu ra sẽ như thế này:

AM

hoặc là

PM

1
Bạn có biết rằng bạn đang sử dụng mã của câu trả lời được chấp nhận?
Thomas Ayoub

Kính gửi @ThomasAyoub, Mã được viết là từ một dòng nguồn dự án của tôi. nó đang hoạt động ngay bây giờ
yazarloo

Xin lỗi, đây là một câu trả lời rất kém, đặc biệt là vì giới thiệuNow
Wolf

0

Đây là một cách dễ dàng hơn để bạn có thể viết định dạng thời gian (hh:mm:ss tt)và hiển thị chúng một cách riêng biệt nếu bạn muốn.

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

hoặc chỉ đơn giản là:

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

0

@ Andy trả lời là được. Nhưng nếu bạn muốn hiển thị thời gian mà không có định dạng 24 giờ thì bạn có thể làm theo cách này

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

Sau đó, bạn sẽ có được thời gian như "10:35:20 PM" hoặc "10:35:20 AM"


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

-2

Dưới đây là một số mã ví dụ:

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

2
Đây không phải là một giải pháp đáng tin cậy. ToLongTimeString()trả về một giá trị dựa trên văn hóa luồng hiện tại. Và không giống như một số giải pháp tương tự được đưa ra trong các câu trả lời khác, mã này thậm chí sẽ không hoạt động nếu bạn đặt văn hóa luồng InvariantCulture, bởi vì Văn hóa bất biến LongTimePatternlà yếu tố quyết định giá trị trả về ToLongTimeString()củaisis HH:mm:ss.
Joe Farrell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.