2012-04-12 54 views
13

Tôi có dữ liệu TimeSpan được biểu thị dưới dạng định dạng 24 giờ, chẳng hạn như 14:00:00, tôi muốn chuyển đổi thành định dạng 12 giờ, 2:00 giờ chiều, tôi googled và tìm thấy thứ gì đó có liên quan trong stackoverflow và msdn, nhưng didn ' t giải quyết vấn đề này, bất cứ ai có thể giúp tôi? Cảm ơn trước.làm thế nào để chuyển đổi định dạng 24 giờ TimeSpan thành định dạng 12 giờ TimeSpan?

Cập nhật Có vẻ như là nó có thể chuyển đổi định dạng TimeSpan 24 giờ để String, nhưng không thể để chuyển đổi chuỗi sang định dạng TimeSpan 12 giờ :(

Nhưng tôi vẫn nhận được câu trả lời tốt SO MANY, nhờ !

+1

Bạn có thể cung cấp mã của mình hay không .. để hiểu vấn đề của bạn .. – vikrantx

+0

Nó không thực sự rõ ràng bạn có thể xây dựng một chút không. Thời gian không phải là thời gian tuyệt đối để bạn không thể đại diện cho nó trong AM/PM. Vì vậy, 14:00:00 không xuất hiện để được Timespan là nó chỉ là thời gian được lưu trữ trong một biến chuỗi trong định dạng này? –

+0

[link] này (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx) sẽ giúp – vikrantx

Trả lời

6

TimeSpan đại diện cho một thời gian khoảng không phải là một thời gian trong ngày. cấu trúc DateTime có nhiều khả năng những gì bạn đang tìm kiếm.

+1

Thực ra' TimeSpan' khá phù hợp để biểu thị thời gian trong ngày miễn là bạn đảm bảo 'TotalDays <1'. Quá tải của toán tử cho phép bạn dễ dàng tính toán những thứ như 'DateTime' cho một sự kiện tại một ngày cụ thể và một' TimeSpan' đã cho đại diện cho một thời gian trong ngày. 'DateTime.TimeOfDay' cũng sẽ trả về' TimeSpan'. –

+0

Nhiều điểm tốt, mặc dù đòi hỏi một chút thay đổi trong suy nghĩ về cách thời gian được biểu diễn. Thật khó hiểu khi kiểu 'DateTime' trả về đại diện cho thời gian trong ngày có khả năng có giá trị thực sự kéo dài _multiple days_ (mặc dù về mặt logic sẽ không bao giờ). –

1

Giả sử bạn là st Aying trong một phạm vi 24 giờ, bạn có thể đạt được những gì bạn muốn bằng cách trừ tiêu cực TimeSpan từ hôm nay DateTime (hoặc bất kỳ ngày cho rằng vấn đề), sau đó dải phần date:

DateTime dt = DateTime.Today; 
dt.Subtract(-TimeSpan.FromHours(14)).ToShortTimeString(); 

Sản lượng:

2 : 00 PM

5

TimeSpan đại diện cho khoảng thời gian (chênh lệch giữa thời gian), không phải là ngày hoặc giờ, do đó, bạn nên xác định nó ở định dạng 24 hoặc 12h. Tôi cho rằng bạn thực sự muốn có một DateTime.

Ví dụ 14:00 của ngày hôm nay:

TimeSpan ts = TimeSpan.FromHours(14); 
DateTime dt = DateTime.Today.Add(ts); 

Sau đó, bạn có thể định dạng ngày đó như bạn muốn:

String formatted = String.Format("{0:d/M/yyyy hh:mm:ss}", dt); // "12.4.1012 02:00:00" - german (de-DE) 

http://msdn.microsoft.com/en-us/library/az4se3k1%28v=vs.100%29.aspx

6

Bạn cần phải chuyển đổi TimeSpan đến một đối tượng DateTime trước tiên, sau đó sử dụng bất cứ điều gì DateTime format bạn cần:

var t = DateTime.Now.TimeOfDay; 

Console.WriteLine(new DateTime(t.Ticks).ToString("hh:mm:ss tt")); 

ToShortTimeString() cũng sẽ hoạt động, nhưng tùy thuộc vào cài đặt theo vùng nên nó sẽ không hiển thị chính xác (hoặc chính xác, tùy thuộc vào cách bạn nhìn thấy) trên các hệ thống không phải của Hoa Kỳ.

+1

Bạn cần phải chỉ định một 'CultureInfo' như' CultureInfo.InvariantCulture' trong lời gọi 'ToString' để tránh các vấn đề khi văn hóa hiện tại sử dụng định dạng thời gian 24 giờ (trong trường hợp đó, trình định dạng' tt' chèn một chuỗi rỗng). –

1
String formatted = yourDateTimeValue.ToString("hh:mm:ss tt"); 
3

Cố Bộ luật này:

int timezone = 0; 

Chuỗi này cung cấp cho 12-giờ định dạng

string time = DateTime.Now.AddHours(-timezone).ToString("hh:mm:ss tt"); 

Chuỗi này cung cấp cho định dạng 24-giờ

string time = DateTime.Now.AddHours(-timezone).ToString("HH:mm:ss tt"); 
22

(Tổng hợp của tôi phân tán ý kiến ​​trong một câu trả lời duy nhất.)

Trước tiên, bạn cần hiểu rằng TimeSpan đại diện cho một khoảng thời gian. Khoảng thời gian này được biểu diễn nội bộ dưới dạng số lượng dấu tick không phải là chuỗi 14:00:00 cũng không phải chuỗi 2:00 PM.Chỉ khi bạn chuyển đổi TimeSpan thành một chuỗi thì có ý nghĩa khi nói về hai biểu diễn chuỗi khác nhau. Chuyển đổi từ một đại diện này sang đại diện khác không thay đổi hoặc chuyển đổi số đếm được lưu trữ trong TimeSpan.

Thời gian viết là 2:00 PM thay vì 14:00:00 là về định dạng ngày và giờ. Tất cả điều này được xử lý bởi lớp học DateTime.

Tuy nhiên, mặc dù TimeSpan đại diện cho một khoảng thời gian nó khá phù hợp để đại diện cho thời gian trong ngày (DateTime.TimeOfDay trả về một TimeSpan). Vì vậy, nó không phải là không hợp lý để sử dụng nó cho mục đích đó.

Để thực hiện định dạng được mô tả, bạn cần phải dựa vào logic định dạng của DateTime hoặc chỉ cần tạo mã định dạng của riêng bạn.

  • Sử dụng DateTime:

    var dateTime = new DateTime(timeSpan.Ticks); // Date part is 01-01-0001 
    var formattedTime = dateTime.ToString("h:mm tt", CultureInfo.InvariantCulture); 
    

    Định dạng specifiers sử dụng trong ToString được ghi nhận trên Custom Date and Time Format Strings trang trên MSDN. Điều quan trọng là chỉ định CultureInfo sử dụng trình chỉ định AM/PM mong muốn. Nếu không, trình chỉ định định dạng tt có thể được thay thế bằng chuỗi rỗng.

  • Sử dụng định dạng tùy chỉnh:

    var hours = timeSpan.Hours; 
    var minutes = timeSpan.Minutes; 
    var amPmDesignator = "AM"; 
    if (hours == 0) 
        hours = 12; 
    else if (hours == 12) 
        amPmDesignator = "PM"; 
    else if (hours > 12) { 
        hours -= 12; 
        amPmDesignator = "PM"; 
    } 
    var formattedTime = 
        String.Format("{0}:{1:00} {2}", hours, minutes, amPmDesignator); 
    

    Phải thừa nhận rằng giải pháp này là phức tạp hơn khá nhiều so với phương pháp đầu tiên.

+0

wow ... câu trả lời chi tiết, 2 giải pháp và hướng dẫn định dạng tùy chỉnh trên MSDN ... cảm ơn rất nhiều! – user1108069

+0

Giải pháp này đã giúp tôi tốt nhất. Biến định dạngTimeTime của tôi trông giống như sau: 'var formattedTime = String.Format (" {0} {1} ", giờ, amPmDesignator);' –

Các vấn đề liên quan