ฉันจะแทนค่าเวลาเท่านั้นใน. NET ได้อย่างไร


238

มีวิธีหนึ่งที่สามารถแทนค่าเวลาเท่านั้นใน. NET โดยไม่ต้องวันที่? ตัวอย่างเช่นการระบุเวลาเปิดของร้านค้า?

TimeSpanระบุช่วงในขณะที่ฉันต้องการเก็บค่าเวลาเท่านั้น การใช้DateTimeเพื่อระบุสิ่งนี้จะส่งผลให้ใหม่DateTime(1,1,1,8,30,0)ซึ่งไม่เป็นที่ต้องการจริงๆ

คำตอบ:


144

ขณะที่คนอื่น ๆ ได้กล่าวว่าคุณสามารถใช้และไม่สนใจวันหรือใช้DateTime TimeSpanโดยส่วนตัวแล้วฉันไม่ได้กระตือรือร้นในการแก้ปัญหาทั้งสองแบบนี้เนื่องจากทั้งสองประเภทไม่ได้สะท้อนแนวคิดที่คุณพยายามนำเสนอจริง ๆ - ฉันถือว่าประเภทวันที่ / เวลาใน. NET ค่อนข้างจะค่อนข้างกระจัดกระจายซึ่งเป็นหนึ่งในเหตุผลที่ฉันเริ่มเวลาดะ ใน Noda Time คุณสามารถใช้LocalTimeประเภทเพื่อแสดงช่วงเวลาของวัน

สิ่งหนึ่งที่ควรพิจารณา: เวลาของวันไม่จำเป็นต้องเป็นระยะเวลาตั้งแต่เที่ยงคืนของวันเดียวกัน ...

หากคุณต้องการแสดงเวลาปิดร้านคุณอาจพบว่าคุณต้องการแสดงเวลา 24:00 นคือเวลาสิ้นสุดของวัน API ส่วนใหญ่วันที่ / เวลา - รวมถึง Noda เวลา - ไม่อนุญาตให้แสดงเป็นค่าช่วงเวลาของวัน)


5
"[T] เวลาของเขาไม่จำเป็นต้องเป็นระยะเวลาตั้งแต่เที่ยงคืนของวันเดียวกัน ... " การประหยัดเวลากลางวันเป็นเพียงเหตุผลเดียวใช่หรือไม่ แค่สงสัยว่าทำไมคุณถึงทิ้งมันไปอย่างไม่มีกำหนด
jason

14
@ Jason: การปรับเวลาตามฤดูกาลเป็นเหตุผลเดียวที่ฉันสามารถคิดได้ทันที - ไม่สนใจวินาทีกระโดดที่ไม่เกี่ยวข้องกับแอปพลิเคชันส่วนใหญ่ ฉันทิ้งมันไว้อย่างนั้นเพื่อกระตุ้นให้คนอื่นคิดว่าทำไมมันถึงเป็นเช่นนั้น ฉันคิดว่ามันเป็นสิ่งที่ดีสำหรับผู้คนที่จะคิดลึกซึ้งเกี่ยวกับวันที่ / เวลามากกว่าที่พวกเขาทำอยู่ในขณะนี้ :)
Jon Skeet

LocalTime เป็นสิ่งที่ฉันต้องการเพื่อสนับสนุนความต้องการของฉัน
sduplooy

1
@sduplooy: อยากช่วยเราพอร์ตจาก Joda Time เหรอ? :)
Jon Skeet

1
@akcool: ตรงตามที่ฉันพูดเมื่อวันที่ 18 พฤษภาคม: Durationใน Noda Time หรือTimeSpanใน BCL ฉันอาจจะแค็ปซูล "สถานที่ในวิดีโอ + ความคิดเห็น" เป็นประเภทแล้วมีอาร์เรย์ประเภทนั้น
Jon Skeet

164

คุณสามารถใช้timespan

TimeSpan timeSpan = new TimeSpan(2, 14, 18);
Console.WriteLine(timeSpan.ToString());     // Displays "02:14:18".

[แก้ไข]
เมื่อพิจารณาคำตอบอื่น ๆ และการแก้ไขคำถามฉันยังคงใช้ TimeSpan ไม่มีจุดในการสร้างโครงสร้างใหม่ที่มีอยู่จากกรอบพอเพียง
ในบรรทัดเหล่านี้คุณจะต้องทำซ้ำข้อมูลหลายชนิด


19
เผง DateTime ใช้ TimeSpan เพื่อจุดประสงค์ดังกล่าว Doc สำหรับคุณสมบัติ DateTime.TimeSpan: "TimeSpan ที่แสดงถึงเศษส่วนของวันที่ผ่านไปตั้งแต่เที่ยงคืน"
Marcel Jackwerth

4
TimeSpan ระบุช่วงเวลาในขณะที่เวลาที่ฉันพูดถึงไม่ใช่ช่วงเวลา แต่เป็นจุดคงที่เดียวในช่วงวันที่
sduplooy

3
มันอาจถูกใช้เป็นจุดคงที่เช่นกันและตามที่คุณระบุไว้ในคำถามก็ไม่มีวันที่ หลังจากทั้งหมดคุณตัดสินใจว่าจะใช้ประเภทข้อมูลเหล่านี้เพื่อผลประโยชน์ของคุณ
John G

9
@ John G: แม้ว่ามันจะสามารถใช้เพื่อเป็นตัวแทนของจุดคงที่ได้ แต่ฉันเห็นด้วยกับ OP - การใช้งานมากเกินไปในTimeSpanลักษณะนี้ค่อนข้างน่าเกลียด มันเป็นสิ่งที่ดีที่สุดที่มีให้ภายในกรอบของตัวเอง
Jon Skeet

5
ในฐานะ. Net 3.5 เอกสาร MSDN ที่ "โครงสร้าง TimeSpan ยังสามารถใช้เพื่อแสดงช่วงเวลาของวันได้ แต่เฉพาะในกรณีที่ไม่เกี่ยวข้องกับเวลาในวันที่ระบุ" กล่าวอีกนัยหนึ่งนี่เป็นคำตอบที่ตรงกับคำถามที่เสนอ
Pharap

34

หากสิ่งนั้นว่างเปล่าDateทำให้คุณเป็นโรคจิตจริงๆคุณสามารถสร้างTimeโครงสร้างที่ง่ายขึ้นได้:

// more work is required to make this even close to production ready
class Time
{
    // TODO: don't forget to add validation
    public int Hours   { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }
}

หรือทำไมต้องกังวล: หากคุณไม่จำเป็นต้องทำการคำนวณใด ๆ กับข้อมูลนั้นเพียงแค่เก็บไว้เป็น Stringกับข้อมูลที่เก็บเพียงว่ามันเป็น


2
อืม ... บางที ... แต่ทำไมต้องคิดค้นล้อใหม่อีกครั้ง? ถ้าภาษานั้นมีคลาส / โครงสร้าง (ซึ่ง C # และ VB.NET ทำอยู่) ให้ไปกับมัน แต่ฉันเข้าใจว่าคุณกำลังพยายามไปกับคำตอบของคุณ
Kris Krause

1
โครงสร้างนี้จะแตกต่างจาก TimeSpan อย่างไรนี่จะเป็นการทำซ้ำในแบบ
John G

4
การลงคะแนนเสียงของคุณเนื่องจากการมีอยู่ของTimeSpanซึ่งจัดการกับสิ่งนี้แล้วและในวิธีที่ดีกว่าอย่างมาก
เที่ยง Silk

1
@ silky ฉันเขียนนี้หลังจากอ่านคำตอบแรก; OP กล่าวในคำถามว่าเขาไม่ต้องการใช้ TimeSpan โดยส่วนตัวฉันเลือกที่จะใช้ DateTime ธรรมดา
Rubens Farias

18
+1 สิ่งนี้ดีกว่า TimeSpan เพราะมีความเป็นไปได้น้อยในการตีความผิด ... TimeSpan มีความหมายจริงๆที่จะใช้เป็นช่วงเวลา (ดู MSDN) ดังนั้นคุณสมบัติเช่น Days ไม่มีความหมายเมื่อใช้ TimeSpan เป็น Time
Zaid Masud

20

ฉันว่าใช้ DateTime หากคุณไม่ต้องการส่วนวันที่ให้เพิกเฉย หากคุณต้องการที่จะแสดงเพียงเวลาให้กับผู้ใช้เอาท์พุทมันจัดรูปแบบให้กับผู้ใช้เช่นนี้:

DateTime.Now.ToString("t");  // outputs 10:00 PM

ดูเหมือนว่าทุกงานพิเศษของการสร้างคลาสใหม่หรือแม้กระทั่งการใช้ TimeSpan นั้นไม่จำเป็น


คุณจะแสดงวินาทีและ mili-seconds ในวิธีนี้อย่างไร
Mona Jalal

5
@MonaJalal มิลลิวินาที: DateTime.Now.ToString("hh:mm:ss.fff");Microseconds: DateTime.Now.ToString("hh:mm:ss.ffffff");Nanoseconds (ถ้า DateTime มีความละเอียดมาก): DateTime.Now.ToString("hh:mm:ss.fffffffff");ตามMSDN
Pharap

2
ดังนั้นใช้เวลา 5 ถึง 10 นาทีในการปรับใช้ชนิดที่เหมาะสมสำหรับสิ่งนี้ดูเหมือนว่าจะทำงานให้คุณมากกว่าต้องพิจารณาใน codebase ทั้งหมดสำหรับการพัฒนาในอนาคตใด ๆ ที่คุณสมบัติ DateTime อาจมีเวลาเท่านั้นและต้องมีการจัดรูปแบบ เช่นนั้นในสถานการณ์เหล่านั้นและส่วนวันที่อาจต้องถูกเพิกเฉย? สนุกกับการแก้จุดบกพร่องที่เกิดขึ้นที่คุณจะได้พบกับ "0001-01-01 10:00" ในฐานข้อมูลของคุณในการสื่อสารภายนอก ฯลฯ ...
MarioDS

10

ฉันคิดว่าคลาสรูเบนส์เป็นความคิดที่ดีดังนั้นจึงคิดว่าจะทำให้ตัวอย่างเวลาที่ไม่เปลี่ยนแปลงของคลาสเวลาของเขาด้วยการตรวจสอบขั้นพื้นฐาน

class Time
{
    public int Hours   { get; private set; }
    public int Minutes { get; private set; }
    public int Seconds { get; private set; }

    public Time(uint h, uint m, uint s)
    {
        if(h > 23 || m > 59 || s > 59)
        {
            throw new ArgumentException("Invalid time specified");
        }
        Hours = (int)h; Minutes = (int)m; Seconds = (int)s;
    }

    public Time(DateTime dt)
    {
        Hours = dt.Hour;
        Minutes = dt.Minute;
        Seconds = dt.Second;
    }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }
}

การตรวจสอบที่คุณเพิ่มมีความสำคัญอย่างยิ่ง ข้อเสียเปรียบหลักของคลาส TimeSpan ในการสร้างแบบจำลองเวลาคือช่วงเวลาของวันสามารถมากกว่า 24 ชั่วโมง
shelbypereira

ทำไมชั่วโมงนาทีและวินาทีจึงใช้ int และไม่ใช่ uint หากไม่มีเหตุผลที่ฉันคิดว่าพวกเขาสามารถใช้ uint ได้โดยตรงและนี่จะเป็นการหลีกเลี่ยงการร่ายในตัวสร้าง
shelbypereira

6

นอกจากChibueze Opata :

class Time
{
    public int Hours   { get; private set; }
    public int Minutes { get; private set; }
    public int Seconds { get; private set; }

    public Time(uint h, uint m, uint s)
    {
        if(h > 23 || m > 59 || s > 59)
        {
            throw new ArgumentException("Invalid time specified");
        }
        Hours = (int)h; Minutes = (int)m; Seconds = (int)s;
    }

    public Time(DateTime dt)
    {
        Hours = dt.Hour;
        Minutes = dt.Minute;
        Seconds = dt.Second;
    }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }

    public void AddHours(uint h)
    {
        this.Hours += (int)h;
    }

    public void AddMinutes(uint m)
    {
        this.Minutes += (int)m;
        while(this.Minutes > 59)
            this.Minutes -= 60;
            this.AddHours(1);
    }

    public void AddSeconds(uint s)
    {
        this.Seconds += (int)s;
        while(this.Seconds > 59)
            this.Seconds -= 60;
            this.AddMinutes(1);
    }
}

วิธีการเพิ่มของคุณสำหรับนาทีและวินาทีไม่ถูกต้องเนื่องจากไม่ได้คำนึงถึงค่าที่สูงกว่า 59
Chibueze Opata

@Chibueze Opate: คุณพูดถูก นี่มันเร็วและสกปรก ฉันควรจะเพิ่มการทำงานบางอย่างในรหัสนี้ ฉันจะอัปเดตในภายหลัง ... ขอบคุณสำหรับคำใบ้ของคุณ!
จูลส์

5

นี่คือคลาส TimeOfDay ที่มีคุณสมบัติครบถ้วน

นี่คือ overkill สำหรับกรณีง่าย ๆ แต่ถ้าคุณต้องการฟังก์ชั่นขั้นสูงมากกว่าที่ฉันทำนี่อาจช่วยได้

มันสามารถจัดการกรณีมุมมุมคณิตศาสตร์พื้นฐานการเปรียบเทียบการโต้ตอบกับ DateTime การแยกวิเคราะห์ ฯลฯ

ด้านล่างนี้เป็นซอร์สโค้ดสำหรับคลาส TimeOfDay คุณสามารถดูตัวอย่างการใช้งานและเรียนรู้เพิ่มเติมได้ที่นี่ :

คลาสนี้ใช้ DateTime สำหรับการคำนวณและการเปรียบเทียบภายในส่วนใหญ่เพื่อให้เราสามารถใช้ความรู้ทั้งหมดที่ฝังอยู่ใน DateTime

// Author: Steve Lautenschlager, CambiaResearch.com
// License: MIT

using System;
using System.Text.RegularExpressions;

namespace Cambia
{
    public class TimeOfDay
    {
        private const int MINUTES_PER_DAY = 60 * 24;
        private const int SECONDS_PER_DAY = SECONDS_PER_HOUR * 24;
        private const int SECONDS_PER_HOUR = 3600;
        private static Regex _TodRegex = new Regex(@"\d?\d:\d\d:\d\d|\d?\d:\d\d");

        public TimeOfDay()
        {
            Init(0, 0, 0);
        }
        public TimeOfDay(int hour, int minute, int second = 0)
        {
            Init(hour, minute, second);
        }
        public TimeOfDay(int hhmmss)
        {
            Init(hhmmss);
        }
        public TimeOfDay(DateTime dt)
        {
            Init(dt);
        }
        public TimeOfDay(TimeOfDay td)
        {
            Init(td.Hour, td.Minute, td.Second);
        }

        public int HHMMSS
        {
            get
            {
                return Hour * 10000 + Minute * 100 + Second;
            }
        }
        public int Hour { get; private set; }
        public int Minute { get; private set; }
        public int Second { get; private set; }
        public double TotalDays
        {
            get
            {
                return TotalSeconds / (24d * SECONDS_PER_HOUR);
            }
        }
        public double TotalHours
        {
            get
            {
                return TotalSeconds / (1d * SECONDS_PER_HOUR);
            }
        }
        public double TotalMinutes
        {
            get
            {
                return TotalSeconds / 60d;
            }
        }
        public int TotalSeconds
        {
            get
            {
                return Hour * 3600 + Minute * 60 + Second;
            }
        }
        public bool Equals(TimeOfDay other)
        {
            if (other == null) { return false; }
            return TotalSeconds == other.TotalSeconds;
        }
        public override bool Equals(object obj)
        {
            if (obj == null) { return false; }
            TimeOfDay td = obj as TimeOfDay;
            if (td == null) { return false; }
            else { return Equals(td); }
        }
        public override int GetHashCode()
        {
            return TotalSeconds;
        }
        public DateTime ToDateTime(DateTime dt)
        {
            return new DateTime(dt.Year, dt.Month, dt.Day, Hour, Minute, Second);
        }
        public override string ToString()
        {
            return ToString("HH:mm:ss");
        }
        public string ToString(string format)
        {
            DateTime now = DateTime.Now;
            DateTime dt = new DateTime(now.Year, now.Month, now.Day, Hour, Minute, Second);
            return dt.ToString(format);
        }
        public TimeSpan ToTimeSpan()
        {
            return new TimeSpan(Hour, Minute, Second);
        }
        public DateTime ToToday()
        {
            var now = DateTime.Now;
            return new DateTime(now.Year, now.Month, now.Day, Hour, Minute, Second);
        }

        #region -- Static --
        public static TimeOfDay Midnight { get { return new TimeOfDay(0, 0, 0); } }
        public static TimeOfDay Noon { get { return new TimeOfDay(12, 0, 0); } }
        public static TimeOfDay operator -(TimeOfDay t1, TimeOfDay t2)
        {
            DateTime now = DateTime.Now;
            DateTime dt1 = new DateTime(now.Year, now.Month, now.Day, t1.Hour, t1.Minute, t1.Second);
            TimeSpan ts = new TimeSpan(t2.Hour, t2.Minute, t2.Second);
            DateTime dt2 = dt1 - ts;
            return new TimeOfDay(dt2);
        }
        public static bool operator !=(TimeOfDay t1, TimeOfDay t2)
        {
            if (ReferenceEquals(t1, t2)) { return true; }
            else if (ReferenceEquals(t1, null)) { return true; }
            else
            {
                return t1.TotalSeconds != t2.TotalSeconds;
            }
        }
        public static bool operator !=(TimeOfDay t1, DateTime dt2)
        {
            if (ReferenceEquals(t1, null)) { return false; }
            DateTime dt1 = new DateTime(dt2.Year, dt2.Month, dt2.Day, t1.Hour, t1.Minute, t1.Second);
            return dt1 != dt2;
        }
        public static bool operator !=(DateTime dt1, TimeOfDay t2)
        {
            if (ReferenceEquals(t2, null)) { return false; }
            DateTime dt2 = new DateTime(dt1.Year, dt1.Month, dt1.Day, t2.Hour, t2.Minute, t2.Second);
            return dt1 != dt2;
        }
        public static TimeOfDay operator +(TimeOfDay t1, TimeOfDay t2)
        {
            DateTime now = DateTime.Now;
            DateTime dt1 = new DateTime(now.Year, now.Month, now.Day, t1.Hour, t1.Minute, t1.Second);
            TimeSpan ts = new TimeSpan(t2.Hour, t2.Minute, t2.Second);
            DateTime dt2 = dt1 + ts;
            return new TimeOfDay(dt2);
        }
        public static bool operator <(TimeOfDay t1, TimeOfDay t2)
        {
            if (ReferenceEquals(t1, t2)) { return true; }
            else if (ReferenceEquals(t1, null)) { return true; }
            else
            {
                return t1.TotalSeconds < t2.TotalSeconds;
            }
        }
        public static bool operator <(TimeOfDay t1, DateTime dt2)
        {
            if (ReferenceEquals(t1, null)) { return false; }
            DateTime dt1 = new DateTime(dt2.Year, dt2.Month, dt2.Day, t1.Hour, t1.Minute, t1.Second);
            return dt1 < dt2;
        }
        public static bool operator <(DateTime dt1, TimeOfDay t2)
        {
            if (ReferenceEquals(t2, null)) { return false; }
            DateTime dt2 = new DateTime(dt1.Year, dt1.Month, dt1.Day, t2.Hour, t2.Minute, t2.Second);
            return dt1 < dt2;
        }
        public static bool operator <=(TimeOfDay t1, TimeOfDay t2)
        {
            if (ReferenceEquals(t1, t2)) { return true; }
            else if (ReferenceEquals(t1, null)) { return true; }
            else
            {
                if (t1 == t2) { return true; }
                return t1.TotalSeconds <= t2.TotalSeconds;
            }
        }
        public static bool operator <=(TimeOfDay t1, DateTime dt2)
        {
            if (ReferenceEquals(t1, null)) { return false; }
            DateTime dt1 = new DateTime(dt2.Year, dt2.Month, dt2.Day, t1.Hour, t1.Minute, t1.Second);
            return dt1 <= dt2;
        }
        public static bool operator <=(DateTime dt1, TimeOfDay t2)
        {
            if (ReferenceEquals(t2, null)) { return false; }
            DateTime dt2 = new DateTime(dt1.Year, dt1.Month, dt1.Day, t2.Hour, t2.Minute, t2.Second);
            return dt1 <= dt2;
        }
        public static bool operator ==(TimeOfDay t1, TimeOfDay t2)
        {
            if (ReferenceEquals(t1, t2)) { return true; }
            else if (ReferenceEquals(t1, null)) { return true; }
            else { return t1.Equals(t2); }
        }
        public static bool operator ==(TimeOfDay t1, DateTime dt2)
        {
            if (ReferenceEquals(t1, null)) { return false; }
            DateTime dt1 = new DateTime(dt2.Year, dt2.Month, dt2.Day, t1.Hour, t1.Minute, t1.Second);
            return dt1 == dt2;
        }
        public static bool operator ==(DateTime dt1, TimeOfDay t2)
        {
            if (ReferenceEquals(t2, null)) { return false; }
            DateTime dt2 = new DateTime(dt1.Year, dt1.Month, dt1.Day, t2.Hour, t2.Minute, t2.Second);
            return dt1 == dt2;
        }
        public static bool operator >(TimeOfDay t1, TimeOfDay t2)
        {
            if (ReferenceEquals(t1, t2)) { return true; }
            else if (ReferenceEquals(t1, null)) { return true; }
            else
            {
                return t1.TotalSeconds > t2.TotalSeconds;
            }
        }
        public static bool operator >(TimeOfDay t1, DateTime dt2)
        {
            if (ReferenceEquals(t1, null)) { return false; }
            DateTime dt1 = new DateTime(dt2.Year, dt2.Month, dt2.Day, t1.Hour, t1.Minute, t1.Second);
            return dt1 > dt2;
        }
        public static bool operator >(DateTime dt1, TimeOfDay t2)
        {
            if (ReferenceEquals(t2, null)) { return false; }
            DateTime dt2 = new DateTime(dt1.Year, dt1.Month, dt1.Day, t2.Hour, t2.Minute, t2.Second);
            return dt1 > dt2;
        }
        public static bool operator >=(TimeOfDay t1, TimeOfDay t2)
        {
            if (ReferenceEquals(t1, t2)) { return true; }
            else if (ReferenceEquals(t1, null)) { return true; }
            else
            {
                return t1.TotalSeconds >= t2.TotalSeconds;
            }
        }
        public static bool operator >=(TimeOfDay t1, DateTime dt2)
        {
            if (ReferenceEquals(t1, null)) { return false; }
            DateTime dt1 = new DateTime(dt2.Year, dt2.Month, dt2.Day, t1.Hour, t1.Minute, t1.Second);
            return dt1 >= dt2;
        }
        public static bool operator >=(DateTime dt1, TimeOfDay t2)
        {
            if (ReferenceEquals(t2, null)) { return false; }
            DateTime dt2 = new DateTime(dt1.Year, dt1.Month, dt1.Day, t2.Hour, t2.Minute, t2.Second);
            return dt1 >= dt2;
        }
        /// <summary>
        /// Input examples:
        /// 14:21:17            (2pm 21min 17sec)
        /// 02:15               (2am 15min 0sec)
        /// 2:15                (2am 15min 0sec)
        /// 2/1/2017 14:21      (2pm 21min 0sec)
        /// TimeOfDay=15:13:12  (3pm 13min 12sec)
        /// </summary>
        public static TimeOfDay Parse(string s)
        {
            // We will parse any section of the text that matches this
            // pattern: dd:dd or dd:dd:dd where the first doublet can
            // be one or two digits for the hour.  But minute and second
            // must be two digits.

            Match m = _TodRegex.Match(s);
            string text = m.Value;
            string[] fields = text.Split(':');
            if (fields.Length < 2) { throw new ArgumentException("No valid time of day pattern found in input text"); }
            int hour = Convert.ToInt32(fields[0]);
            int min = Convert.ToInt32(fields[1]);
            int sec = fields.Length > 2 ? Convert.ToInt32(fields[2]) : 0;

            return new TimeOfDay(hour, min, sec);
        }
        #endregion

        private void Init(int hour, int minute, int second)
        {
            if (hour < 0 || hour > 23) { throw new ArgumentException("Invalid hour, must be from 0 to 23."); }
            if (minute < 0 || minute > 59) { throw new ArgumentException("Invalid minute, must be from 0 to 59."); }
            if (second < 0 || second > 59) { throw new ArgumentException("Invalid second, must be from 0 to 59."); }
            Hour = hour;
            Minute = minute;
            Second = second;
        }
        private void Init(int hhmmss)
        {
            int hour = hhmmss / 10000;
            int min = (hhmmss - hour * 10000) / 100;
            int sec = (hhmmss - hour * 10000 - min * 100);
            Init(hour, min, sec);
        }
        private void Init(DateTime dt)
        {
            Init(dt.Hour, dt.Minute, dt.Second);
        }
    }
}

2

หากคุณไม่ต้องการใช้ DateTime หรือ TimeSpan และเพียงแค่ต้องการเก็บเวลาของวันคุณสามารถเก็บวินาทีตั้งแต่เที่ยงคืนใน Int32 หรือ (ถ้าคุณไม่ต้องการวินาที) นาทีตั้งแต่เที่ยงคืน จะพอดีกับ Int16 การเขียนวิธีการสองสามอย่างที่จำเป็นต้องใช้เพื่อเข้าถึงชั่วโมงนาทีและวินาทีจากค่าดังกล่าว

เหตุผลเดียวที่ฉันสามารถนึกถึงการหลีกเลี่ยง DateTime / TimeSpan ก็คือถ้าขนาดของโครงสร้างมีความสำคัญ

(แน่นอนว่าถ้าคุณใช้รูปแบบที่เรียบง่ายเหมือนกับที่กล่าวไว้ข้างต้นในชั้นเรียนมันจะเป็นการง่ายที่จะเปลี่ยนพื้นที่เก็บข้อมูลด้วย TimeSpan ในอนาคตหากคุณรู้ทันทีว่าจะให้ประโยชน์แก่คุณ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.