2008-12-16 27 views
28

Tôi đang sử dụng DateTime trong C# để hiển thị thời gian. Phần nào mọi người sử dụng khi xây dựng thời gian?C# DateTime: "Ngày" sử dụng khi nào tôi chỉ sử dụng "thời gian"?

ví dụ: nội dung sau không hợp lệ:

//4:37:58 PM 
DateTime time = new DateTime(0, 0, 0, 16, 47, 58); 

vì không có tháng thứ 0 hoặc ngày thứ 0.

Tôi có sử dụng ngày không của COM không?

//4:37:58 PM 
DateTime time = new DateTime(1899, 12, 30, 16, 47, 58); 

Hoặc có thể là SQL Server?

//4:37:58 PM 
DateTime time = new DateTime(1900, 1, 1, 16, 47, 58); 

tôi nhận ra đó là tùy ý, kể từ khi tôi sẽ bỏ qua các phần cập nhật trong mã, nhưng nó vẫn sẽ được tốt đẹp để có thể sử dụng:

DateTime duration = time2 - time1; 

trả lời

tôi nghĩ tôi thích MinValue

DateTime time = DateTime.MinValue.Date.Add(new TimeSpan(16, 47, 58)); 

Lưu ý: tôi không thể sử dụng một TimeSpan, vì không lưu trữ thời gian trong ngày. Và lý do tôi biết đó là bởi vì không có cách nào để hiển thị nội dung của nó như là một thời gian.

Điều cần nói là TimeSpan ghi lại khoảng thời gian khoảng thời gian, không phải là thời gian trong ngày. ví dụ.

TimeSpan t = new TimeSpan(16, 47, 58); 

t.ToString(); 

trả về một khoảng thời gian trong định dạng giờ: phút: giây, ví dụ:

16:47:58 

chứ không phải là một thời điểm:

4:47:58 PM (United States) 
04:47:58 nm (South Africa) 
4:47:58.MD (Albania) 
16:47:58  (Algeria) 
04:47:58 م (Bahrain) 
PM 4:47:58 (Singapore) 
下午 04:47:58 (Taiwan) 
04:47:58 PM (Belize) 
4:47:58 p.m. (New Zealand) 
4:47:58 μμ (Greece) 
16.47.58  (Italy) 
오후 4:47:58 (Korea) 
04:47:58 ب.ظ (Iran) 
ਸ਼ਾਮ 04:47:58 (India) 
04:47:58 p.m. (Argentina) 
etc 

Trong khác các từ, có sự khác biệt giữa một khoảng thời gian và một thời gian. Và cũng nhận ra rằng TimeSpan không cung cấp một cơ chế để chuyển đổi một khoảng thời gian vào một thời điểm trong ngày - và có một lý do cho điều đó.

+7

Bạn nói rằng TimeSpan không lưu trữ thời gian trong ngày, nhưng cấu trúc DateTime có thuộc tính được gọi là TimeOfDay và loại là một TimeSpan. –

+0

Vui lòng xem xét chỉnh sửa câu trả lời từ câu hỏi. –

Trả lời

23

còn DateTime.MinValue thì sao?

+0

tôi thích điều đó tốt nhất, chứ không phải là các con số được mã hóa cứng, nhưng thêm một khoảng thời gian vào Ngày của ngày lễ. –

2

Làm thế nào về DateTime.Now.TimeOfDay và sử dụng TimeSpan?

Re "vì điều đó không lưu trữ thời gian trong ngày." - tốt, nếu bạn nghĩ đến một thời điểm từ 01 đêm trở đi, hãy xem TimeSpan.

"Thời lượng", ví dụ: hét lên TimeSpan.

+0

Trừ hai DateTimes mang lại một TimeSpan. –

4

Cho rằng DateTime.TimeOfDay trả về một TimeSpan, tôi sẽ sử dụng nó.

Tại sao bạn không thể sử dụng một TimeSpan? Tôi không hiểu nhận xét của bạn rằng nó không lưu trữ thời gian trong ngày.

6

Một TimeSpan chắc chắn nhất có thể lưu trữ thời gian trong ngày - bạn chỉ cần coi giá trị là khoảng thời gian trôi qua kể từ nửa đêm, về cơ bản giống như cách chúng ta đọc đồng hồ.

+0

TimeSpan không lưu trữ thời gian trong ngày. Đã cập nhật câu hỏi để cho bạn biết lý do. –

+0

Chỉ lưu trữ dưới dạng UTC :) –

1

Tôi khuyên bạn nên DateTime.MinValue

3

Để hiển thị một TimeSpan định dạng với văn hóa địa phương, chỉ cần thêm nó vào một ngày như DateTime.Today. Một cái gì đó như thế này:

(DateTime.Today + timeSpan) .ToString();

Vì giá trị của bạn thực sự không đại diện cho một ngày, bạn nên lưu trữ nó như là một TimeSpan cho đến khi thời gian đến để hiển thị nó.

1

Bạn chỉ có thể tạo một DateTime mới bằng chuỗi ký tự.

Chuỗi đen cho thời gian:

DateTime t = new DateTime("01:00:30"); 

Chuỗi đen đối với ngày:

DateTime t = new DateTime("01/05/2008"); // english format 
DateTime t = new DateTime("05.01.2008"); // german format 

Đối với một DateTime với ngày và thời gian giá trị:

DateTime t = new DateTime("01/05/2008T01:00:30"); 

Trong hầu hết các trường hợp, khi tạo một DateTime, tôi đặt nó thành DateTime.Now, nếu nó không thực sự được đặt thành bất kỳ thứ gì khác. Nếu bạn khởi tạo một DateTime theo cách thủ công, bạn nên cẩn thận với thiết lập DateTimeKind một cách chính xác, nếu không điều này có thể dẫn đến những điều bất ngờ.

5

Cá nhân tôi muốn tạo một tùy chỉnh Timestruct có chứa một phiên bản DateTime và có đặc tính tương tự, hàm tạo, v.v ... nhưng không hiển thị ngày/tháng/v.v. Chỉ cần làm cho tất cả các truy cập công cộng của bạn đi qua đến trường hợp chứa. Sau đó, bạn chỉ có thể có thời đại như là một lĩnh vực private static readonly DateTime và nó không quan trọng những gì giá trị bạn chọn vì nó tất cả gọn gàng chứa trong cấu trúc tùy chỉnh của bạn. Trong phần còn lại của mã, bạn có thể chỉ cần viết:

var time = new Time(16, 47, 58); 
0

Sử dụng TimeSpan và đặt UTC nếu bạn gặp sự cố TimeZone.

1

Tôi có thể đề xuất rằng trong một số trường hợp, cấu trúc tùy chỉnh có thể làm gì? Nó có thể có một giá trị hậu thuẫn Int32 (có 86 triệu mili giây trong một ngày, điều này sẽ phù hợp trong một Int32).

Có thể có được chỉ thuộc tính:

Giờ Minutes Giây mili giây

Bạn cũng có thể quá tải nhà khai thác như +, - và như vậy. Thực hiện IEquatable, IComparable và bất cứ điều gì có thể là trường hợp. Quá tải bằng, ==. Quá tải và ghi đè ToString.

Bạn cũng có thể cung cấp thêm nhiều phương pháp để xây dựng từ một DateTime hoặc nối thêm vào một ngày giờ và cứ thế.

8

Hãy giúp đỡ những kẻ muốn có một cấu trúc Time:

/// <summary> 
/// Time structure 
/// </summary> 
public struct Time : IComparable 
{ 
    private int minuteOfDay; 
    public static Time Midnight = "0:00"; 
    private static int MIN_OF_DAY = 60 * 24; 

    public Time(int minuteOfDay) 
    { 
     if (minuteOfDay >= (60 * 24) || minuteOfDay < 0) 
      throw new ArgumentException("Must be in the range 0-1439", "minuteOfDay"); 
     this.minuteOfDay = minuteOfDay; 
    } 

    public Time(int hour, int minutes) 
    { 
     if (hour < 0 || hour > 23) 
      throw new ArgumentException("Must be in the range 0-23", "hour"); 
     if (minutes < 0 || minutes > 59) 
      throw new ArgumentException("Must be in the range 0-59", "minutes"); 

     minuteOfDay = (hour * 60) + minutes; 
    } 

    #region Operators 
    public static implicit operator Time(string s) 
    { 
     var parts = s.Split(':'); 
     if (parts.Length != 2) 
      throw new ArgumentException("Time must be specified on the form tt:mm"); 
     return new Time(int.Parse(parts[0]), int.Parse(parts[1])); 
    } 


    public static bool operator >(Time t1, Time t2) 
    { 
     return t1.MinuteOfDay > t2.MinuteOfDay; 
    } 
    public static bool operator <(Time t1, Time t2) 
    { 
     return t1.MinuteOfDay < t2.MinuteOfDay; 
    } 
    public static bool operator >=(Time t1, Time t2) 
    { 
     return t1.MinuteOfDay >= t2.MinuteOfDay; 
    } 
    public static bool operator <=(Time t1, Time t2) 
    { 
     return t1.MinuteOfDay <= t2.MinuteOfDay; 
    } 
    public static bool operator ==(Time t1, Time t2) 
    { 
     return t1.GetHashCode() == t2.GetHashCode(); 
    } 
    public static bool operator !=(Time t1, Time t2) 
    { 
     return t1.GetHashCode() != t2.GetHashCode(); 
    } 

    /// Time 
    /// Minutes that remain to 
    /// Time conferred minutes 
    public static Time operator +(Time t, int min) 
    { 
     if (t.minuteOfDay + min < (24 * 60)) 
     { 
      t.minuteOfDay += min; 
      return t; 
     } 
     else 
     { 
      t.minuteOfDay = (t.minuteOfDay + min) % MIN_OF_DAY; 
      return t; 
     } 
    } 

    public static Time operator -(Time t, int min) 
    { 
     if (t.minuteOfDay - min > -1) 
     { 
      t.minuteOfDay -= min; 
      return t; 
     } 
     else 
     { 
      t.minuteOfDay = MIN_OF_DAY + (t.minuteOfDay - min); 
      return t; 
     } 
    } 

    public static TimeSpan operator -(Time t1, Time t2) 
    { 
     return TimeSpan.FromMinutes(Time.Span(t2, t1)); 
    } 
    #endregion 


    public int Hour 
    { 
     get 
     { 
      return (int)(minuteOfDay/60); 
     } 
    } 
    public int Minutes 
    { 
     get 
     { 
      return minuteOfDay % 60; 
     } 
    } 


    public int MinuteOfDay 
    { 
     get { return minuteOfDay; } 
    } 

    public Time AddHours(int hours) 
    { 
     return this + (hours * 60); 
    } 

    public int CompareTo(Time other) 
    { 
     return this.minuteOfDay.CompareTo(other.minuteOfDay); 
    } 

    #region Overrides 
    public override int GetHashCode() 
    { 
     return minuteOfDay.GetHashCode(); 
    } 

    public override string ToString() 
    { 
     return string.Format("{0}:{1:00}", Hour, Minutes); 
    } 
    #endregion 

    /// 
    /// Safe enumerering - whatever interval applied max days 
    /// 
    /// Start time 
    /// Spring in minutes 
    /// 
    public static IEnumerable Range(Time start, int step) 
    { 
     return Range(start, start, step); 
    } 

    /// 
    /// Safe enumeration - whatever interval applied max days 
    /// 
    public static IEnumerable Range(Time start, Time stop, int step) 
    { 
     int offset = start.MinuteOfDay; 
     for (var i = 0; i < Time.Span(start, stop); i += step) 
     { 
      yield return Time.Midnight + (i + offset); 
     } 
    } 

    /// 
    /// Calculates the number of minutes between t1 and t2 
    /// 
    public static int Span(Time t1, Time t2) 
    { 
     if (t1 < t2) // same day 
      return t2.MinuteOfDay - t1.MinuteOfDay; 
     else // over midnight 
      return MIN_OF_DAY - t1.MinuteOfDay + t2.MinuteOfDay; 
    } 
} 
+0

xin lỗi bản dịch xấu từ ngôn ngữ Đan Mạch! –

+7

Uh, cấu trúc 'Thời gian' với độ phân giải là một phút? Hãy cho tôi một break... – Lucero

0

Không khác biệt nhiều so với câu trả lời chấp nhận. Chỉ để thực hiện ý tưởng.

public class TimeOfDay 
{ 
    public DateTime time; 
    public TimeOfDay(int Hour, int Minute, int Second) 
    { 
     time = DateTime.MinValue.Date.Add(new TimeSpan(Hour, Minute, Second)); 
    } 
} 
Các vấn đề liên quan