Chuyển đổi giá trị khoảng thời gian sang định dạng “hh: mm Am / Pm” bằng C #


82

Tôi có một giá trị được lưu trữ trong biến kiểu System.TimeSpannhư sau.

System.TimeSpan storedTime = 03:00:00;

Tôi có thể lưu trữ lại nó trong một kiểu biến khác Stringnhư sau không?

String displayValue = "03:00 AM";

Và nếu storedTimebiến có giá trị là

storedTime = 16:00:00;

thì nó sẽ được chuyển đổi thành:

String displayValue = "04:00 PM";

Câu trả lời:


191

Bạn có thể làm điều này bằng cách thêm khoảng thời gian của mình vào ngày tháng.

TimeSpan timespan = new TimeSpan(03,00,00);
DateTime time = DateTime.Today.Add(timespan);
string displayTime = time.ToString("hh:mm tt"); // It will give "03:00 AM"

có thể thêm thời gian mặc định từ bộ chọn ngày bootstrap này, ví dụ datepicker value + TimeofDay:?
— Shaiju T

1
Lưu ý rằng điều này sẽ luôn cung cấp thời gian đồng hồ 12 giờ với tiền tố AM / PM. Nếu bạn muốn kết quả làm theo một nền văn hóa nhất định, bạn có thể sử dụng ShortTimePatternthay vì:string displayTime = time.ToString("t" [, culture]);
— Sphinxxx

1
Hoặc bạn có thể chỉ cần gọitime.ToShortTimeString()
— Mardok

time.ToShortTimeString () không duy trì số 0 trước đó trong 03:00 chiều. time.ToString ( "hh: mm tt") sẽ chăm sóc của nó
— Souvik Basu

Tôi muốn TimeSpan không có bất kỳ ngày tháng nào, có thể không quan trọng nhưng bạn ràng buộc ngày hôm nay và nó không phù hợp, Sử dụng như string.Format (@ "{0: hh \: mm \: ss}", timespan) tốt hơn nhưng tôi không 'không biết làm thế nào để thêm AM / PM vào đó :(
— QMaster 4/12/16

13

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" - >> Bộ chỉ định Am / Pm.

miễn chuyển đổi từ 23:12 đến 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();

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

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

// 23:12 م

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

trong văn hóa hệ thống khác tùy thuộc vào những gì được đặt trên tùy chọn ngôn ngữ và khu vực của cửa sổ, 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 trong 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 tôi đang nói gì.

vì vậy ai có thể buộc tôi phải hiển thị các Từ Am và Pm bằng 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 đó thành 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

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

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

Thận trọng đối với Exemple tiếng Ả Rập:

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 م

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

ví dụ: ar ar-SA Ả Rập ar-BH ar-BH Ả Rập (Bahrain) ar-DZ ar-DZ Ả Rập (Algeria) ar-EG ar-EG Ả Rập (Ai Cập)


5
Câu hỏi đặt ra về TimeSpan. Câu trả lời này dành cho DateTime.
— thelem


10
string displayValue="03:00 AM";

Đây là một thời điểm , không phải khoảng thời gian (TimeSpan).

Vì vậy, có gì đó sai với thiết kế cơ bản hoặc các giả định của bạn.

Nếu bạn muốn sử dụng nó, trước tiên bạn sẽ phải chuyển đổi nó thành DateTime (tại thời điểm). Bạn có thể định dạng DateTime mà không có phần ngày, đó sẽ là chuỗi mong muốn của bạn.

TimeSpan t1 = ...;
DateTime d1 = DateTime.Today + t1;               // any date will do
string result = d1.ToString("hh:mm:ss tt");

Biến storeTime có thể có giá trị như
storeTime=16:00:00;

Không, nó có thể có giá trị là 4 giờ nhưng biểu diễn là nhị phân, TimeSpan không thể ghi lại sự khác biệt giữa 16:00và 4 pm.


11
Nó không may rằng DateTime.TimeOfDaylợi nhuận một TimeSpan- Microsoft dẫn bạn đến thiết kế này :(
— Jon Skeet

2
@JonSkeet Tôi không biết rằng đó là thiết kế tồi tệ nhất (và tôi biết bạn là một người thành công trong vấn đề này, một cách trân trọng, với công việc của bạn trên Noda), vấn đề là hiểu những hạn chế của cách diễn giải. Không có khái niệm về người thân DateTime, nếu có, thì điều này ("03:00 AM") sẽ đơn giản là một ví dụ của điều đó. Tuy nhiên, tôi có thể thấy rằng đối với phần lớn các trường hợp sử dụng, thiết kế đó (tương đối DateTime) sẽ phức tạp hóa các vấn đề (tất nhiên, điều này có thể làm cho nó phức tạp hơn khi thực hiện công việc rất cụ thể xung quanh ngày, giờ, tuyệt đối hay không , múi giờ, v.v.)
— casperOne

7
@casperOne: Về cơ bản, nó sử dụng một kiểu để biểu diễn thông tin mà sẽ được lưu trữ một cách hợp lý trong một kiểu khác, chỉ vì nếu bạn nheo mắt đủ mạnh thì chúng trông giống nhau. Tôi sẽ không đề nghị quá tải ý nghĩa của DateTimethậm chí hơn nữa (đó là đã đủ xấu). Nên có một kiểu đại diện cho "thời gian trong ngày" - tất nhiên là chính xác những gì tôi đã triển khai trong Noda Time. Bất cứ khi nào bạn cố gắng nhồi nhét nhiều khái niệm khác nhau vào một số lượng nhỏ các loại, bạn nhất định sẽ gặp phải những vấn đề như thế này.
— Jon Skeet

1
Câu trả lời này rất hay vì nó giải thích lý do tại sao TimeSpan hoạt động theo cách của nó, thay vì chỉ cách khắc phục sự cố. Thực sự cần có ba loại: DateTime, TimeOfDayvà Date.
— thelem

03:00 AMkhông phải là một "thời điểm". Đó là một "điểm trong một ngày".
— Alex

10

Thực hiện một số cõu các câu trả lời hiện có tại đây:

public static string ToShortTimeSafe(this TimeSpan timeSpan)
{
    return new DateTime().Add(timeSpan).ToShortTimeString();
} 

public static string ToShortTimeSafe(this TimeSpan? timeSpan)
{
    return timeSpan == null ? string.Empty : timeSpan.Value.ToShortTimeSafe();
}

3
Đây là câu trả lời Sanest
— toddmo

9

Bạn sẽ cần lấy một DateTimeđối tượng từ của bạn TimeSpanvà sau đó bạn có thể định dạng nó một cách dễ dàng.

Một giải pháp khả thi là thêm khoảng thời gian vào bất kỳ ngày nào có giá trị thời gian bằng không.

var timespan = new TimeSpan(3, 0, 0);
var output = new DateTime().Add(timespan).ToString("hh:mm tt");

Giá trị đầu ra sẽ là "03:00 AM"(đối với ngôn ngữ tiếng Anh).


6

Bạn không thể thêm AM / PM vào a TimeSpan. Dù sao thì bạn cũng sẽ phải liên kết TimaSpangiá trị với DateTimenếu bạn muốn hiển thị thời gian ở định dạng đồng hồ 12 giờ.

TimeSpankhông nhằm mục đích sử dụng với định dạng đồng hồ 12 giờ, vì chúng ta đang nói về khoảng thời gian ở đây.

Như nó nói trong tài liệu ;

Một TimeSpanđối tượng đại diện cho một khoảng thời gian (khoảng thời gian hoặc thời gian đã trôi qua) được đo bằng số ngày, giờ, phút, giây và phần nhỏ của giây dương hoặc âm . Các TimeSpancấu trúc cũng có thể được sử dụng để đại diện cho thời gian trong ngày, nhưng chỉ khi thời gian không liên quan đến một ngày cụ thể. Nếu không, cấu trúc DateTimehoặc DateTimeOffsetnên được sử dụng thay thế.

Ngoài ra Microsoft Docs mô tả như sau;

Một TimeSpangiá trị có thể được biểu thị bằng [-]d.hh:mm:ss.ff, trong đó dấu trừ tùy chọn cho biết khoảng thời gian âm, dthành phần là ngày, hhlà giờ được đo trên đồng hồ 24 giờ , mmlà phút, sslà giây và fflà phần nhỏ của giây.

Vì vậy, trong trường hợp này, bạn có thể hiển thị bằng AM / PM như sau.

TimeSpan storedTime = new TimeSpan(03,00,00);
string displayValue = new DateTime().Add(storedTime).ToString("hh:mm tt");


Lưu ý bên :
Cũng cần lưu ý rằng thuộc tính TimeOfDay của DateTimelà a TimeSpan, nơi nó đại diện cho

một khoảng thời gian đại diện cho phần của ngày đã trôi qua kể từ nửa đêm.


3

Phân tích cú pháp khoảng thời gian thành DateTime và sau đó sử dụng Định dạng ("hh: mm: tt"). Ví dụ.

TimeSpan ts = new TimeSpan(16, 00, 00);
DateTime dtTemp = DateTime.ParseExact(ts.ToString(), "HH:mm:ss", CultureInfo.InvariantCulture);
string str = dtTemp.ToString("hh:mm tt");

str sẽ là:

str = "04:00 PM"

2

Bạn có thể thử điều này:

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

bạn có thể loại bỏ hh hoặc mm hoặc ss hoặc tt theo nhu cầu của bạn trong đó hh là giờ trong 12 giờ định dạng, mm là phút, ss là giây và tt là AM / PM.


1
Parse timespan to DateTime. For Example.    
//The time will be "8.30 AM" or "10.00 PM" or any time like this format.
    public TimeSpan GetTimeSpanValue(string displayValue) 
        {   
            DateTime dateTime = DateTime.Now;
                if (displayValue.StartsWith("10") || displayValue.StartsWith("11") || displayValue.StartsWith("12"))
                          dateTime = DateTime.ParseExact(displayValue, "hh:mm tt", CultureInfo.InvariantCulture);
                    else
                          dateTime = DateTime.ParseExact(displayValue, "h:mm tt", CultureInfo.InvariantCulture);
                    return dateTime.TimeOfDay;
                }

0

Lúc đầu, bạn cần chuyển đổi khoảng thời gian thành cấu trúc DateTime:

var dt = new DateTime(2000, 12, 1, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds)

Sau đó, bạn cần chuyển đổi giá trị thành chuỗi với định dạng Thời gian ngắn

var result = dt.ToString("t"); // Convert to string using Short Time format
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.